PHP preg_replace - h1 etiketleri içinde eşleşmeyen

2 Cevap php

Ben uzun bir HTML dize içinde bulunursa anahtar kelimeler için bir bağlantı eklemek için preg_replace kullanıyorum. Ben anahtar kelime h1 etiketi veya güçlü etiketleri içinde bulunursa bir bağlantı eklemek istemiyorum.

Aşağıdaki regex neredeyse çalışır ve temelde (sanırım) diyor ki: Anahtar kelime hemen h1 etiketi veya güçlü bir etiketi ya tarafından sarılmış değilse o zaman google bir kalın bağlantı olarak, eşleşti anahtar kelime ile değiştirin.

$result = preg_replace('%(?!<h1>)(?!<strong>)\b(bobs widgets)\b(?!<\/strong>)(?!<\/h1>)%i','<a href="http://www.google.com"><strong>$1</strong></a>', $result, -1);

(Anahtar kelime bir çok ile recursing çünkü ben eğer güçlü etiketleri maç istemiyorum nedeni böylece sonraki geçişte zaten bağlantılı anahtar bağlamak istemiyorum)

ve ince yukarıdaki eserler maç olmayacak:

<h1>bobs widgets</h1>

H1 etiketi hemen anahtar kelime ya da bir yan değil çünkü Ancak, aşağıdaki metinde anahtar kelime maç olacak:

<h1>Here are bobs widgets for sale</h1>

Ben alanlarda yan isteğe bağlı ya da yapmak gerekir ve \ s ekleyerek denedim * ama her yerde beni almaz. Ben burada doğru yönde bir itme için çok minnettar olurum.

2 Cevap

Düzenli ifadeler, bu iş için yanlış bir araçtır. Bu, (most famous thread sitesi gibi) Yığın taşması birçok kez tartışıldı.

Ne ihtiyacınız gibi Simple HTML DOM Parser gibi bir HTML ayrıştırıcı vardır. Kendinize bir iyilik yapın ve baştan böyle bir şey kullanın. Bir <h1> Birisi bir nitelik nerede ekledi, ya da belki birileri yanlış etiketleri kapattı, böylece bir </strong> üzerine karışık düzen var ve içine çalıştırdığınızda ne olacak hayal a </h1>. Böyle şeyler normal bir ifade ile çalışmaya Başlarken sorun değmez, ve hatta bazen mümkün değildir.

Sadece ... sonunda bu yaklaşım, hüzün yol açacağını unutmayın, ve daha iyi bir yaklaşım arıyorsanız başlamak gerekir. Tek yönlü parseable xml içine html düzeltmek için 'düzenli' kullanmak için, ve sonra php verilerle çalışmak için bir kaç xml manipülasyon API'ler sunar.

Burada bir cevap zaten bulunuyor.

Bazı joker yerine sözcük sınırları ekleyebilirsiniz. Böyle bir şey hile yapmak gerekir:

([^<>]*)(bobs widgets)([^<>]*)

Daha sonra, çıktı içinde metnin kalan tutmak için biraz daha değiştirme işaretleri ekleyebilirsiniz:

'$1<a href="http://www.google.com"><strong>$2</strong></a>$3'

Şimdi kaydetmek ve kanepenin arkasına saklanmak vurdu ;)