Önde gelen beyaz boşluk soyarak bir regex Yardım

2 Cevap php

Ben Kohana kütüphanenin temel işlevi, text::auto_p() fonksiyonunu değiştirerek duyuyorum.

Fonksiyonu "steroid nl2br ()" olarak tanımlıyor. Esasen, bu <br /> tek satır sonlarını sağlar, ancak çift satır sonları <p> etiketleri ile çevrilidir.

Onunla bulduk sınırlama o olacak ama <br /> s <pre> öğesi. Bu benim istediğim değil, hangi çift yeni hatları oluşturmak olacaktır. Ben bir regex ile ön elemanları almak için bir değişiklik yaptık ve <br /> çıkarmaz, bir geri çağırma iyi çalışıyor.

Ancak, asıl sorun auto_p() 'd alır benim metin kod örnekleri var, ve ben (okunabilmesi için) girinti korumak için ihtiyaç vardır. Ne yazık ki benim için, fonksiyon şeritler lider ve hatları üzerinde sondaki boşlukları.

İşte lider alan şeritler regex olduğunu

$str = preg_replace('~^[ \t]+~m', '', $str);

Ben iyi regex gurusu değilim, ama diyor ki eminim "en az bir ve boş bir dize ile bunların yerine orada önde gelen boşlukları ve sekmeleri alın."

Ben bu satırı kaldırarak denedim, ama o katacak <br /> burada ben kesinlikle bunları istemiyorum - bir durumda, böyle çıktı başlamıştı

<ul><br />
    <li>something</li>
</ul>

Nasıl bir <pre> elemanın içinde önde gelen uzay şerit değil bu regex veya kodunu değiştirmek istiyorsunuz?

The original helper function from Kohana is available here. (Neredeyse altına gidin).

Ben birkaç 'bir HTML ayrıştırıcı kullanın' tipi cevaplar alırsınız biliyorum - ve doğru olabilir iken - mevcut kod sadece regex kullanır, ve ben (ben vb kütüphane dahil etmek zorunda değilsiniz) basit bir çözümü tercih ederim .

Zaman ayırdığınız için teşekkürler.

2 Cevap

İşte ben bunu yapacağını nasıl:

$str = preg_replace(
    '~^[ \t]++(?=(?:[^<]++|<(?!/?+pre\b))*+(?:\z|<pre\b))~im',
    '', $str);

Bazı çizgi-baştaki boşlukları eşleşen sonra, ileri yönlü <pre> veya </pre> etiketleri için önde tarar. Ileri yönlü ve bu et biraz:

(?:[^<]++|<(?!/?+pre\b))*+

Bu sıfır veya bir sol açılı ayraç değil daha bir şey maçları, or, bir sol açılı ayraç bir <pre> veya </pre> etiketinin başlangıcı değilse. Bu kısım sadece bir <pre> (başlangıç) etiketi, bir </pre> (biten) etiketi ya da girdi sonunu karşılaştığında eşleşen duracaktır. Onu durduran bir bitiş etiketi varsa, size bir <PRE> öğesi içinde olduğunu biliyorum, bu yüzden değiştirme yapmak istemiyorum.

Iyelik nicelik ('++', '*+', ve '?+') önlemek için gerekli olan catastrophic backtracking. (Ben yardım edemem: bu ifade beni her zaman Half-Life den resonance cascade scenario düşündürüyor.)

Bu teknik aynı zamanda oldukça iyi biçimlendirilmiş HTML, yani tüm <pre>...</pre> düzgün dengeli etiketleri varsayar. Çok SGML yorumlar irade karışıklık o kadar içinde etiketleri, - bunlar dengeli olmak olur sürece. Eğer iki kat uzun ve üç kat çirkin olarak regex yapıyor sakıncası yoksa sen de, yorumlarla başa çıkabilirim. :)

Senin sorunun sanırım çok tartışılan - bu bağlantıyı kontrol

http://us3.php.net/manual/en/function.nl2br.php#91828

Bu, bir de:

http://us3.php.net/manual/en/function.nl2br.php#39641