2010-03-25 6 views
2

텍스트에서 $word의 모든 항목을 [$word]($word) (Markdown에서 링크를 만들 때)으로 바꾸고 싶습니다 (링크에 아직없는 경우). 예 :Regexp : 특정 컨텍스트에서만 바꾸기

[$word homepage](http://w00tw00t.org)

해야 하지

[[$word]($word) homepage](http://w00tw00t.org)을하게된다.

따라서 $ 단어가 [와] 사이에 있는지 확인하고 필요없는 경우에만 바꾸면됩니다.

이렇게 preg_replace 명령을 사용할 수 있습니까?

답변

3

이것은 생각만큼 간단하지 않습니다. 이전의 대답은 많은 상황에서 실패합니다. $ 워드 특수 정규 표현식 문자가 포함

$text = preg_replace('/\G((?:[^\[]|\[[^\]]*\])*?)('.$word.')/', '$1[$2]($2)', $text) 

경우, 당신이 그것을 preg_quote로 할 수 있습니다 : 여기에 [] 이미 내부 아니라 모든 $ 단어를 교체해야 하나입니다.

$text = 'aa foo bb [foo bar](http://example.com) cc foo dd'; 
$word = 'foo'; 
$text = preg_replace('/\G((?:[^\[]|\[[^\]]*\])*?)('.$word.')/', '$1[$2]($2)', $text); 
echo $text; 

출력 :

aa [foo](foo) bb [foo bar](http://example.com) cc [foo](foo) dd

+0

$의 word' 특수 정규 표현식 문자를 포함하지 않더라도', 당신은()'preg_quote'로 할 수 있습니다. 단순히 그것이 옳은 일이기 때문입니다. – Tomalak

0

나는 "~ $ 단어를 (?!. *?]) ~"

생각

"~$word(?=[^\[\]]*(\[|$))~" 

예를 들어,

$src = "aa foo [ bbb foo xyz ] cc foo dd"; 
$word = "foo"; 
print preg_replace("~$word(?=[^\[\]]*(\[|$))~", "[FOO](bar)", $src);