Değişken genişlik negatif Geriye bakan değiştirilmesi gerekir

3 Cevap php

Burada birçok soru (ve daha birçok web sitesi) baktım ve bazı ipuçlarını vermiş ama hiçbiri bana kesin bir cevap verdi. Düzenli ifadeleri biliyorum ama ben bir guru olmaktan çok uzağım. Bu özel soru PHP regex ile ilgilenir.

Ben belirli bir sınıfın bir köprü ile çevrili olmayan bir metinde kelime bulmak gerekir. Örneğin, ben olabilir

This <a href="blabblah" class="no_check">elephant</a> is green and this elephant is blue while this <a href="blahblah">elephant</a> is red.

Ben ikinci ve üçüncü filler karşı maç gerek ama ilk (test sınıfı tarafından belirlenen "no_check") olacaktır. Not there could more attributes köprüler içinde sadece href ve sınıf daha. Ben ile geldi

((?<!<a .*class="no_check".*>)\belephant\b)

hangi ama PHP regex test yazılımı güzel çalışıyor.

Herhangi bir yardım büyük beğeni topluyor. Eğer düzenli bir ifade veremez ama bunun için ihtiyaç aşmak olacağını PHP kodu mantığı çeşit bulabilirsiniz, ben eşit minnettar olacaktır.

3 Cevap

Ben karma bir çözüm kullanarak sona erdi. Ben belirli anahtar kelimeler için bir metin ayrıştırmak ve zaten bir bağlantı parçası olduğunu ve eğer bir köprü eklemek olmadığını kontrol etmek vardı çıkıyor. Burada sağlanan çözümler çok ilginç ama tam olarak ne gerekli için yeterince uygun değildir.

Bir HTML çözümleyici kullanma fikri olsa iyi biriydi ve ben şu anda başka bir projede bir tane kullanıyorum. Bu çözüm öneren, Alan Moore ve Eric Strom hem kapalı Yani şapka.

Değişken genişlik negatif görünüm arkasında mevcut değilse hızlı ve kirli çözüm bellekte dize ters ve yerine değişken genişlik negatif görünüm-ahead kullanmaktır. sonra tekrar dize ters.

Ama bir HTML çözümleyici kullanarak daha iyi olabilir.

Ben basit yaklaşım "no_check" niteliği, or aradığınız kelime ile either tam bir <a> öğesi maç olacağını düşünüyorum. Örneğin:

<a [^<>]*class="no_check"[^<>]*>.*?</a>|(\belephant\b)

Eğer eşleşen kelime varsa, o yakalama grubu # 1 olacaktır; değilse, o grup boş veya null olmalıdır.

Tabii ki, "basit yaklaşımı" ben gerçekten basit regex yaklaşımı anlamına geliyordu. Hatta basit bir HTML çözümleyici kullanmak olacaktır.