2016-09-23 3 views
0

preg_replace를 사용하여 여러 줄 문자열의 모든 특수 문자를 백 슬래시로 이스케이프하려고 시도하지만이 문자열은 전달되고 반복적으로 전달됩니다. 혼란을 피하십시오. 이스케이프되지 않은 특수 문자 (공백, 줄 바꿈, 캐리지 리턴 및 이스케이프 문자 자체 제외) 만 이스케이프하는 정규식을 사용하려고했습니다. 두 번 아래와 같이PHP에서 preg_replace를 사용하여 이스케이프 처리되지 않은 특수 문자를 올바르게 이스케이프 처리 할 수 ​​없습니다.

\$foo \$bar \:\:\n 

을하지 탈출 : 즉, :

$foo \$bar :\:\n 

가되기 위해 이스케이프해야

\$foo \\$bar \:\\:\\n 

나는 다음과 가까이 왔 :

preg_replace("/([^\\\\])([^a-z0-9\\\\ \r\n])/i","$1\\\\$2",$input); 

그러나 두 개의 동일한 특수 문자가 순서대로 나타나면 두 문자 중 첫 번째 문자 만 이스케이프 처리됩니다. 예를 들어

:

\..\.. 

을하지만 실제로 내가 원하는 :

....

가가되는 말도 안되는 문제에 대한

\.\.\.\. 

죄송합니다, 아니면 내가 바보 같은 짓하는거야! 미리 감사드립니다 :)

+0

나는 그렇게 단지 그들 중 하나를 탈출, 그룹 한 2 군에서 그들을 캡처 순서대로 두 개의 특수 문자와 일치 할 수있는 정규식 함께 할 수있는 뭔가 생각합니다. 하지만 preg_replace가 처음부터 끝까지 문자열을 끝내면 첫 번째 이스케이프 처리되지 않은 문자와 일치하고 이스케이프 처리 된 후 다음 이스케이프 처리되지 않은 문자와 일치합니다. 그룹 2와 동일한 일치 또는 그 반대의 경우 그룹 1에서 일치하는 것을 방지하는 것이 올바른 방법일까요? 어떻게해야합니까? –

답변

1

정규식에서 부정적인 lookbehind를 사용해보십시오. 이처럼 :

preg_replace("/(?<!\\\\)([^a-z0-9\\\\ \r\n])/i","\\\\$1",$input) 
+0

고마워, 나는 그것을 시도 할 것이다. 뒤에 부정적인 시각은 정확히 무엇을합니까? –

+0

이 주제는 이미 다루어 져 있습니다 [여기] (http://stackoverflow.com/questions/2973436/regex-lookahead-lookbehind-and-atomic-groups) – Nick

관련 문제