Belirli kelimeleri içeren linkler ayrıştırmak için Regex

4 Cevap php

Birisi fark, bu iki normal ifadeler arasında ne olduğunu bana söyleyebilir, this bir adım daha ileri iplik alarak? Html dışında bir bağlantı çekerek: Her ikisi de aynı şeyi başarmak gibi görünüyor.

Anlatım 1:

'/(https?://)?(www.)?([a-zA-Z0-9_%]*)\b.[a-z]{2,4}(.[a-z]{2})?((/[a-zA-Z0-9_%])+)?(.[a-z])?/'

Anlatım 2:

'/<a.*?href\s*=\s*["\']([^"\']+)[^>]*>.*?<\/a>/si'

Birini kullanmak için daha iyi olurdu ki? Ve nasıl belli kelimeleri içeren yalnızca bağlantıları maç için bu ifadelerin birini değiştirmek olabilir, ve bu kelimeleri içermeyen herhangi bir sonuç görmezden?

Teşekkürler.

4 Cevap

Fark ifadesi 1 özellikleri aşağıdaki, geçerli ve tam Urı'ler arar olmasıdır. Yani bir yerde kod içindeki tüm adresler tam olsun. Çok sık kullanılan göreceli adresler uymuyor, çünkü bu, tüm bağlantıları almak için gerçekten ilgili değildir, ve bu bağlantı hedefleri değil sadece olanları, her url alır.

İkinci a etiketleri arar ve href öznitelik içeriğini alır. Yani bu size her bağlantı alacaksınız. Bu ifadede bir hata * dışında, onu kullanmak için oldukça güvenli ve size her link almak için yeterince iyi çalışacak - böyle bir boşlukla veya diğer nitelikleri gibi görünebilir yeterli farklılıkları, denetler.

* Bu href niteliğin kapanış teklifi için görünmüyor Ancak bu ifadede bir hata var, o eklemeniz gerekir veya garip şeyler maç olabilir:

/<a.*?href\s*=\s*["\']([^"\'>]+)["\'][^>]*>.*?<\/a>/si

edit in response to the comment:

word bağlantı url içinde aramak için kullanın:

/<a.*?href\s*=\s*["\']([^"\'>]*word[^"\'>]*)["\'][^>]*>.*?<\/a>/si

word bağlantı metni içinde aramak için kullanın:

/<a.*?href\s*=\s*["\']([^"\'>]+)["\'][^>]*>.*?word.*?<\/a>/si

Vakaların çoğunda ben şiddetle bu bağlantıları almak için bir HTML çözümleyici (örneğin {[) (0]} gibi) kullanmanızı tavsiye ediyorum. HTML ayrıştırmak için normal ifadeler kullanarak HTML düzenli değil çünkü sorunlu olacak ve dikkate almak kenar durumlarda sonu olacak.

here daha fazla bilgi için bkz.

/<a.*?href\s*=\s*["']([^"']+)[^>]*>.*?<\/a>/si

Hatta olmayan açgözlü biçimde, .* ile çok dikkatli olmak zorunda. . kolayca özellikle dotall modunda, Beklediğinizden daha fazla eşleşir. Örneğin:

<a name="foo">anchor</a>
<a href="...">...</a>

Saniyenin sonunda ilk <a başlangıcından itibaren maçlar.

Cabası olgu gibi:

<a href="a"></a >
<a href="b"></a>

veya:

<a href="a'b>c">

veya:

<a data-href="a" title="b>c" href="realhref">

veya:

<!-- <a href="notreallyalink"> -->

ve çok çok daha eğlenceli kenar durumlarda. Daha olanaklarını yakalamak için regex geliştirmek için deneyebilirsiniz, ancak HTML (arkadaşlarınıza söyleyin) regex çözümlenen olamaz çünkü, hepsini almak asla!

HTML + regex aptalca bir oyundur. Kendinize bir iyilik yapın. Bir HTML çözümleyici kullanın.

Kısa bir bakışta ilk çöp ama ikinci bir html elemanı eşleştirme, metin olarak bir bağlantı maç için çalışıyor gibi görünüyor.