2013-03-13 2 views
0

정규 표현식 배열을 사용하여 PHP에서 문자열을 찾아 바꾸려고 시도하지만 오류가 발생합니다. unknown modifier. 이것이 대중적인 이슈 인 것으로 알고 있지만, 제 시나리오에서 그것을 고치는 방법을 이해하지 못합니다. 그러나PHP preg_replace "unknown modifier"

/\{youtube\(\(\?\!\}\)\.\)\*\}/ 

다음 반환

$pattern = '/' . preg_quote($pattern) . '/'; 

: 어떤 문자를 이스케이프 할에 대해 다음 코드를 실행

{youtube((?!}).)*} 

: 여기

내 원래 정규식 패턴입니다 ,이 패턴을 preg_replace 통해 실행할 때 다음 오류가 발생합니다 :

Warning: preg_replace() [function.preg-replace]: Unknown modifier 'y' ... 

변경해야 할 사항과 여기에 표시 한 코드의 단계를 알려주세요. 여기

$content = "{youtube}omg{/youtube}"; 
$find = array(); 
$replace = array(); 

$find[] = '{youtube((?!}).)*}'; 
$replace[] = '[embed]http://www.youtube.com/watch?v='; 
$find[] = '{/youtube((?!}).)*}'; 
$replace[] = '[/embed]'; 

foreach ($find as $key => $value) { 
    $find[$key] = '/' . preg_quote($value) . '/'; 
} 

echo preg_replace($find, $replace, $content); 

간단히에 정규식 구분 기호를 변경하려면 live example

+0

아니, 어쨌든 왜'preg_quote'를 사용하고 있습니까? 리터럴 문자열 부분을 의미하지만 이미 정규식 패턴을가집니다. – mario

+0

마리오, 나는 그들이 그런 식으로 원인을 격리하려했다고 생각합니다. 그것 * 여전히 * 이상한 오류를 던지는 사실 자체가 흥미 롭습니다. – Joey

+0

@mario 이전 문제를 해결하기 위해'preg_quote'를 사용하고 있습니다 ...하지만 그것 없이도 같은 오류가납니다. –

답변

1

을 것 :

많은 감사

편집 요청으로 1

, 여기에 내가 사용하고 코드입니다 패턴에서 사용되지 않는 무언가,이 예제에서 나는 잘 작동하는 @을 사용했습니다.

preg_quote. \ + * ? [^] $ () { } = ! < > | : - 만 이스케이프합니다. 따라서 패턴에서 이스케이프되지 않은 문자를 사용할 때뿐만 아니라 정규 표현식 구분 기호로 사용할 경우 예상대로 작동하지 않습니다. 위와 같이 구분 기호를 변경하거나 preg_quote($str, $delimiter) overload의 일부로 명시 적으로 preg_quote으로 전달하십시오.

$content = "{youtube}omg{/youtube}"; 
$find = array(); 
$replace = array(); 

$find[] = '{youtube((?!}).)*}'; 
$replace[] = '[embed]http://www.youtube.com/watch?v='; 
$find[] = '{/youtube((?!}).)*}'; 
$replace[] = '[/embed]'; 

foreach ($find as $key => $value) { 
    $find[$key] = '@' . preg_quote($value) . '@'; 
} 

echo preg_replace($find, $replace, $content); 
+0

안녕 루디, 오랫동안 아무 말도 ... 어떻게 된거 야? 이 문제를 지적 해 주셔서 감사합니다 (그리고 @mario),'preg_quote'가 대체를하지 못했습니다.하지만 이것을 제거하면 이제는 작동합니다. –

+0

특히 패턴이 런타임에 계산 될 때 패턴에없는 구분 기호를 선택하는 것이 항상 쉬운 것은 아닙니다. 더 좋은 방법은 표준 구분 기호''/ ''를 사용하여 두 번째 인수로''preg_quote'에 전달하는 것입니다. 그래서'preg_quote'는 다른 특수 문자와 함께 인용 부호를 붙입니다. 코드 예를 보려면 내 대답을 참조하십시오. –

+0

@ilmv - 상황이 좋다, 어때? 이메일을 보내고 따라 잡아야합니다 : D –

0

이 같은 preg_quote에 대한 두 번째 매개 변수로 구분 통과해야합니다

$find[$key] = '/' . preg_quote ($value, '/') . '/'; 

그렇지 않으면 구분이 인용되지 않고, 따라서 원인이됩니다 문제.

0

컴퓨터에서 병원 대기실에 앉아있을 수도 있지만 문제는 복잡해 보입니다. 내가 올바르게 이해하는 나는 경우

,이 같은 일부를 교체하려면 :

{youtube something="maybe"}http://...{/youtube} 

으로 :

[embed]http://...[/embed] 

아니?그 솔루션의 라인을 따라 뭔가로 간단 그렇다면

:

preg_replace('#{(/?)youtube[^}]*}#', '[\1embed]', $content); 

이 태그의 개방/폐쇄 다움의 보존되고, 무언가에 정규식을 포장 중요한 고려 사항 이것은 대상 문자열 (이 경우, 해시)과 너무 많이 충돌하지 않습니다.

+0

preg_replace_all은 첫 번째 태그가 아닌 모든 태그를 캡처하는 데 필요할 수 있습니다. – Steve