2017-10-13 1 views
-1

PHP 파일에서 모든 리터럴을 제거하는 방법이 필요합니다. 문자열에 중첩 된 따옴표가 없을 때 내 현재 regexp 솔루션을 잘 작동합니다. 이스케이프 된 따옴표도 처리하도록 업데이트하려고했는데, 대부분 이스케이프 된 이스케이프 문자가있는 경우는 예외입니다. RegExp 리터럴 캡쳐

이 올바르게 수행 할 필요가있는 경우는, 처리 할 수 ​​있어야합니다 것입니다

"텍스트"
"\"문자 \ ""
"\\"
"\"\ \\ ""

그래서 내가보기에, 일정한 양의 이스케이프 문자가있는 경우와 고르지 않은 부분이있는 경우를 처리해야합니다. 하지만 이것을 어떻게 정규 표현식으로 가져 옵니까?

업데이트 내가 통해 인덱스 다른 부분, 내가 함께 연주하고 작은 프로젝트에 대한 뭔가를 검색하기가 더 쉽게 PHP 파일을 정리할

. 리터럴은 거의 모든 것을 포함 할 수 있기 때문에 일부 검색과 유사한 데이터를 포함 할 수도 있습니다. 그래서 난에 싸여 파일에 아무것도 제거 할 "또는".

"/ \"[^ \ "* \"/ "

가없는 한이 작동합니다 중첩 된 견적 "\"데이터 \ "".

"/ \"(\\\\\ "| [^ \"]) * \ "\\"

이없는 한 "/"

이 작동합니다 내가 필요한 것입니다

$ var = "...";

$ var에 어울린다 =;

+0

죄송합니다, 당신이 무슨 뜻인지 모른다. [? '~ (?

+0

각 경우에 예상되는 출력을 표시 할 수 있습니까? –

+0

스레드를 추가 정보로 업데이트했습니다. –

답변

1

이 정규 표현식을 기반으로 대체를 사용할 수 있습니다

찾기 : ((?<!\\)(?:\\.)*)(["'])(?:\\.|(?!\2).)*?\2
바꾸기 : 당신은 당신이로 인코딩 PHP에서이 정규 표현식을 (사용하려는 경우 것으로 $1

주 문자열 리터럴)에서 백 슬래시를 이스케이프 처리하고 정규 표현식을 인용해야합니다 (예 :

preg_replace("~((?<!\\\\)(?:\\\\.)*)([\"'])(?:\\\\.|(?!\\2).)*?\\2~s", "$1", $input); 

PHP 문자열 리터럴이 여러 줄에 걸쳐있을 수 있으므로 s 수정자가 추가되어 .이 개행 문자와도 일치합니다.

eval.in

NB에서 실행을 참조하십시오 없습니다 : 또한 히어 닥 표기법에 대해 생각해야합니다 ...

+0

문제를 만든 사람조차도 모든 예제와 문제없이 잘 시도해 보았습니다. 감사. 그렇습니다. 주석 등으로 ​​인해 문제가 발생하지만 파일은 php_strip_whitespace()를 통해 실행됩니다. –