Sadece bir regex ile bir HTML beyanı dışında kelime maç

2 Cevap php

Ben aşağıda kod ile elde etmek istediğiniz şey: eşleşen belirtilen kelime harf duyarsız bir bağlantı ile değiştirin ve sadece bir kez metin ve.

Ben bir dize kelime 'foo' eşleştirmek için aşağıdaki preg_match var:

if (preg_match("/\bfoo\b/i", $text, $results, PREG_OFFSET_CAPTURE)) { 
  // substr_replace the word 'foo' for a link <a href.. 
}

Hiçbir HTML olmadan bir metin için bir sorun, ancak HTML ile aşağıdaki metni düşünün:

Lorem ipsum dolor sit amet, <a href="/foo-bar/" title="foo bar">some other foo link</a> consectetur adipiscing elit foo bar.

(Başlık ve isim kısmı için aynı sorunu) href bölümlük içinde foo ile bir maç olacak, çünkü bu durumda, mevcut bağlantı içinde yeni bir bağlantı olacak.

Nasıl desen HTML beyanı dışında sadece 'foo' maç için değiştirilebilir?

2 Cevap

Don't parse HTML with regular expressions. XPath yerine kullanın. PHP kolayca make use of it.

Ne istediğinizi için XPath ifadesi oldukça basittir. Bir div, bu ne istediğiniz içinizde aramak istediğiniz etiketi varsayarak:

//div/text()[contains(.,'foo')]

Eğer metin düğümü var sonra, herhangi bir HTML etiketleri içeren bunun korkusu olmadan bir düzenli ifadeyi çalıştırabilirsiniz.

Şimdiye kadar karşılaşılan açılış ve kapanış parantez sayısını olabilir. Onlar farklı ise, bu henüz bir HTML etiketinin içine şu demektir kapanış biri, karşılaşılan olmadan bir parantez açtım demektir.

Ancak, a terrible idea HTML ayrıştırma için normal ifadeler kullanarak, genel unutmayın.