Href değerinin içeriği alınıyor

Regex kullanarak href içeriğini yakalamam gerekiyor. Örneğin, kuralı uygularken href = "www.google.com", www.google.com adresini almak istiyorum. Ayrıca, yalnızca # değerine sahip olan tüm hrefsleri göz ardı etmek isterim.

Şimdi, bir süredir etrafta oynuyordum ve bununla geldim:

href=(?:\"|\')((?:[^#]|.#.|.#|#.)+)(?:\"|\')

http://www.rubular.com/ adresinden denediğimde, çekicilik gibi çalışır, ancak ben PHP'de preg_replace_callback ile kullanmanız gerekiyor ve beklenen sonucu alamıyorum (PHP'de test etmek için bu siteyi kullanıyordum: http://www.pagecolumn.com/tool/pregtest.htm ).

Benim hatam ne?

1
Öncelikle ve en önemlisi: REGEX'İ KULLANMAYIN PARSE HTML
katma yazar Madara Uchiha, kaynak
Kabul edildi;)
katma yazar misaizdaleka, kaynak

3 cevap

Since parsing HTML using regular expressions is a Bad Thing™, I suggest a less crude method:

$dom = new DomDocument;
$dom->loadHTML($pageContent);

$elements = $dom->getElementsByTagName('a');

for ($n = 0; $n < $elements->length; $n++) {
    $item = $elements->item($n);
    $href = $item->getAttribute('href');
   //here's your href attribute
}
9
katma
@LinusKleen Neden bu kötü bir şey? HTML'yi regex ile neden ayrıştırmanın kötü bir şey olduğunu henüz anlamadım. Oh ve o adam nedenini açıklamadı, sadece ranted. Bir açıklama yardımcı olacaktır!
katma yazar Mob, kaynak
LinusKleen ve @mario Teşekkürler.
katma yazar Mob, kaynak
@Mob: Rağım gerçekten anlamsız (ve eğitici etkisi olmadan). İnsanlar "HTML'yi ayrıştırmak" dediğinde, aslında "ekstraksiyon" anlamına gelir. Normal ifadeler gibi basit durumlarda hangisinin yeterli olduğu için. SGML ve HTML'yi (çok fazla xml ve XHTML değil) doğru bir şekilde ayrıştırmak için daha karmaşık PCRE desenlerine ihtiyacınız vardır. stackoverflow.com/questions/4231382/… - Bu sadece SO üzerinde bir meme oldu ve şimdi imleçli (ve yanlış) cevap asla regex kullanmaktır. (Kullanım koşullarına veya çabaya bağlı olmalıdır.)
katma yazar mario, kaynak
Harika! Zarif ve verimli bir çözüm! Çok büyük tavsiye! Teşekkürler!
katma yazar misaizdaleka, kaynak

İlk ve en önemlisi: REGEX’i PARSE HTML’de KULLANMAYIN


Ben şöyle bir şeyle giderdim:

href=("|')?([^\s"'])+("|')?
1
katma

Nasıl hakkında:

href\s*=\s*"([^#"]+#?[^"]*)"
1
katma