Bir ifade, bir Ra değil Check

2 Cevap php

Bir arkadaşım HTML kodunu seçin öbekleri etrafında bağlantıları koyuyorsa bir reklam senaryosunu yazmaktadır.

(- Öbeği bir elemanın öznitelik bulunursa gibi buna izin vermez ya da başka bir öğesi), o komut yazmak istemiyor öbeği bir <a> elemanı zaten içeride Doğal olarak, eğer Bu doğrulama kıracak gibi bir bağlantı var.

O ne düşündüğümü sordu. Bazı etrafında bumbling sonra, sana ne düşündüğünü tüm soruyorum.

Sadece netleştirmek için, giriş HTML içinde bir bütün blog yazısı. Örnek:

<p>This is a short blog post about ponies!</p>
<p>I have <a href="/ponies">written about ponies before</a>.</p>
<p><img src="/media/ponies.jpg" /></p>

Bu Örneğin, <a href="http://www.ponies.com">ponies</a> ile ponies (her durumda) yerine (ama orijinal dava ile) istediğiniz söylüyorlar.

Yukarıda çıktısı şöyle olmalıdır:

<p>This is a short blog post about <a href="http://www.ponies.com">ponies</a>!</p>
<p>I have <a href="/ponies">written about ponies before</a>.</p>
<p><img src="/media/ponies.jpg" /></p>

Biz tam kod gerekmez ama iyi fikirler / regexes son derece açıktır. O, PHP bu yazıyor ama dil-nötr gayet iyi.

2 Cevap

Istediğiniz dizeyi içeren metin düğümleri bulur XPath ifade kullanmak, ama onlar kabul elemanlarının çocukları konum yalnızca:

//p/text()[contains(.,'ponies')]

Yani doğrudan keman biliyorum size metin düğümlerini verecektir. Bu noktada, güvenli bir şekilde anahtar kelime bulmak için normal bir ifade kullanabilirsiniz, ancak doğrudan arama ve değiştirme yerine bir desen maç yapsak daha iyi.

Sağlanan örnek girişine karşı kullanılan, tek maç "This is a short blog post about ponies!". Bu sadece <p> elemanların doğrudan çocuklar için görünüyor, çünkü <a> elemanında "midilli", uyumlu değildir. Bunu böyle <div> s, ya da (örneğin belirli sınıflara sahip olanlar gibi) sadece belirli <p> elemanları gibi diğer unsurları, maç yapmak için bu geliştirebilirsiniz.

Böyle bir XPath ifadesi kullanarak ilgili güzel bir bonus sadece metin düğümleri dönmek olduğunu. "Midilli", herhangi bir HTML elemanlarının yanında hiç görünmüyor, bu yüzden kesinlikle XPath Cthulhu'nun gazabını çağrıştıran olmadan, onun bir şey yaptıktan sonra düzenli ifadeler kullanarak güvendeyiz demektir.

XPath XML ve HTML ile ilgili yaygın bir yöntemdir. PHP seçim için birçok XPath kütüphaneler vardır. Oranlar zaten XPath ile çalışan bir kütüphaneyi kullanarak konum vardır.


Alternatif bir yöntem, HTML belgesindeki tüm metin düğümleri bulmak ve velileri ne onları filtre etmektir. Sonuç aynıdır, ancak gereksinimlerine bağlı olarak, bu şekilde daha iyi ölçek olabilir:

//text()[parent::p and contains(.,'ponies')]

Bu ifade, bu gibi okur:

//text()                  # Find all text nodes in the document
    [parent::p            # whose parent is a "p" element
    and                   # and
    contains(.,'ponies')] # contains the string "ponies"

Im üzgünüm ama söylemek zorundayım

Parsing Html The Cthulhu Way