2012-03-05 4 views
0

아래 패턴은 정규식 편집기에서 작동하는 것으로 보이지만 PHP에서는 작동하지 않습니다 (오류 없음). 구분 기호를 추가하고 preg_quote를 통해 패턴을 실행하면이 문제를 해결할 수 있다고 생각했습니다. 여기서 내가 누락 된 단계에 대한 도움을 주시면 감사하겠습니다.preg_quote에도 불구하고 작동하는 정규식 패턴이 작동하지 않습니다

코드 샘플 :

$pattern = '%(?<[email protected]|.)singleline(?=[^\]\[]*\])%'; 
$pattern = preg_quote($pattern); 
$output = preg_replace($pattern, "", $output); 

HTML 샘플 :

<p>[@address|singleline]</p> 
+0

(즉, 당신은 탈출 할 몇 가지 문자 수 있습니다)? –

답변

2

preg_quote 정규 표현식 구문 문자 문자를 이스케이프합니다. 여기에는 . \ + * ? [^] $ () { } = ! < > | : -이 포함됩니다. preg_quote을 사용하지 마십시오.

$pattern = '%(?<[email protected]|.)singleline(?=[^\]\[]*\])%'; 
$output = preg_replace($pattern, "", $output); 

편집 : 당신은 당신이 정규식 구문에 사용되는 문자를 포함하여 정규식 패턴에 포함 할 원하는 내용이 있다면 당신은 preg_quote을 사용할 수 있습니다. 예를 들어 :

$input = "item 1 -- total cost: $5.00"; 
$pattern = "/total cost: " . preg_quote("$5.00") . "/"; 
// $pattern should now be "/total cost: \$5.00/" 
$output = preg_replace($pattern, 'five dollars', $input); 

이 경우, 당신은이 정규식 구문에 사용되기 때문에 $을 탈출해야합니다. 이를 찾으려면 $ 대신 \$을 정규식으로 사용해야합니다. preg_quote를 사용하면이 변경이 수행됩니다.

+0

Thx. 그게 효과가있어 ... 생각하지 않은 바보처럼 느껴져. 모든 것이 이미 탈출했기 때문에 preg_quote가 필요하지 않습니까? – jsuissa

+0

아무 것도 이스케이프 할 필요가 없습니다. @ a.tereschenkov가 언급했듯이, 패턴에서 벗어나야 할 내용이 있다면 preg_quote가 적합 할 것입니다. 예를 들어 답을 편집하겠습니다. – thetaiko

1

전체 패턴에는 적용하지 말고 외부 문자열에 대해서만 적용해야한다고 생각합니다. 이 코드를보고 :

<?php 
    $content = 'singleline'; 
    $content = preg_quote($content); 
    $output = '<p>[@address|singleline]</p>'; 
    $output = preg_replace('%(?<[email protected]|.)'.$content.'(?=[^\]\[]*\])%', "", $output); 

    echo $output; 

당신은 내가 신청 볼 수 있듯이 preg_quote 만 $의 콘텐츠 변수는 $ 출력 변수의 예상 내용을 추가 할 수

+0

Thx. 그 비슷한 방법을 사용하고 있습니다. 이 질문에 대해 저는 변수를 코딩했습니다. – jsuissa

관련 문제