Normal ifade, nasıl tüm etiketleri içine etiket IMG ihtiva etmeyen bir bulmak için?

2 Cevap php

Kullanıcının böyle bir HTML kodu olduğunu varsayalım. Biz onun içine img etiketini içeren YAPMAYIN tüm <a href=""></a> etiketleri almak gerekir.

<a href="http://domain1.com"><span>Here is link</span></a>
<a href="http://domain2.com" title="">Hello</a>
<a href="http://domain3.com" title=""><img src="" /></a>
<a href="http://domain4" title=""> I'm the image <img src="" /> yeah</a>

Ben tüm bağlantıları bulmak için bu normal bir ifade kullanıyorum

preg_match_all("!<a[^>]+href=\"?'?([^ \"'>]+)\"?'?[^>]*>(.*?)</a>!is", $content, $out);

Ben bunu değiştirebilirsiniz

preg_match_all("!<a[^>]+href=\"?'?([^ \"'>]+)\"?'?[^>]*>([^<>]+?)</a>!is", $content, $out);

Ama nasıl içinde <img altdizesine içeren sonuçları dışarıda söyleyebilir <a href=""></a>?

Teşekkür ederim

2 Cevap

Dom gitmek için bir yoldur, ancak burada ilgi uğruna çözümdür:

Çok normal ifadelerde bazı maçları hariç en kolay yolu bir 'negatif görünüm öncesinde' ya da 'olumsuz görünüm arkada' kullanmaktır. Negatif ifade dizede herhangi bulunursa, maç başarısız olur.

Örnek:

^(?!.+<img.+)<a href=\"?\'?.+\"?\'?>.+</a>$

Maçlar:

<a href="http://domain1.com"><span>Here is link</span></a>
<a href="http://domain2.com" title="">Hello</a>

Ama eşleşmiyor:

<a href="http://domain3.com" title=""><img src="" /></a>
<a href="http://domain4" title=""> I'm the image <img src="" /> yeah</a>

Negatif görünüm ileriye string bu parçasıdır:

(?!.+<img.+)

Bu herhangi bir karakter tarafından takip

<a href=\"?\'?.+\"?\'?>.+</a>

Gerisi html çapa etiketleri için benim genel maç, alternatif bir maç ifadesini kullanmak isteyebilirsiniz.

Sen başlangıç ​​atlarsanız ve kullanımın bağlı ^ $ karakter sona gerekebilir.

Öncesinde bir görünüm Daha fazla bilgi / arkasında

http://www.codinghorror.com/blog/2005/10/excluding-matches-with-regular-expressions.html

Sen Simple DOM parser gibi bir HTML ayrıştırıcı kullanmanız gerekir. Sen cannot parse HTML with regular expressions.