Regexp: sadece belirli bir bağlamda değiştirin

2 Cevap php

Bir metinde, ben tarafından $word tüm tekrarlarını değiştirmek istiyorum [$word]($word) (Markdown bir bağlantı oluşturmak için), ancak bir bağlantı değil zaten sadece. Örnek:

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

not haline gelmelidir

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

Böylece, $ kelime arasında [ve] bir yerdedir ve bu durumda değilse, sadece yerini olup olmadığını kontrol etmeniz gerekir.

Bunun için bir preg_replace komuta düşünebiliyor musunuz?

2 Cevap

Bu düşündüğünüz kadar basit değildir. Önceki cevaplar birçok durumda başarısız olur. Zaten burada [] içeride değil, her $ sözcüğü değiştirmek gerekir biri:

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

$ Kelime özel sıradanifade karakterler içeriyorsa, preg_quote bunu isteyebilirsiniz.

Example

$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;

Çıktı:

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

i think

"~$word(?!.*?])~"

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

örneğin

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