php eregi_replace için alt metin deseni bulamazsınız regex

2 Cevap php

Ben bir eregi_replace için regex bir alt niteliği bulunmayan bir dize yakalamak için gerekli ne olacağını merak ediyorum.

örneğin Bu bulmak ve John Doe değiştirmeniz gerekir:

"John Doe doğdu ..."

ama bulamıyor / örneğin herhangi etiketinde zaman John Doe adlı değiştirin:

<img src="/jd.jpg" alt="John Doe at the beach" />

2 Cevap

Ben bir etiketi içinde değilse "John Doe" değiştirmek istedim, ben bu yapardı:

$str = preg_replace('/John Doe(?![^<>]*+>)/i', $new_name, $str);

(?![^<>]*+>) bir negatif ileri yönlü olduğunu; "her köşeli öncesinde bu nokta varsa, ilk bir ayraç değildir" diyor. Öznitelik değerleri açılı ayraçlar içerebilir beri, kusursuz değil, ama benim deneyim nadiren yapmak.

Regexes HTML ile temelden uyumsuz; Hatta lookarounds ve possessive quantifiers, genellikle gibi basitleştirerek varsayımlara dayanmak zorunda gibi preg_ suite, tarafından sunulan gelişmiş özellikler ile no angle brackets in attribute values . Ben bile çok-daha-sınırlı ereg_ fonksiyonları ile bu işi girişimi değildir.

You've reached the limitations of regex. You'll need a custom parser for this. tags can be nested, and regex can't match patterns like

<b>
<<b>>
<<<b>>>

gibi desen eşleştirme değil iken

<b>>
<<b>
<<b>>>

vb