Ra arasındaki her şeyi bulmak için sıradanifade

7 Cevap php

I <a> ve </a> etiketleri arasında her şeyin bir listesini yapmak için bir yol bulmaya çalışıyorum. Böylece (onlar sayfada denilen şeyin linkler gitmek değil, ama) ben bağlantıların bir listesi var ve ben bağlantıların isimlerini almak istiyorum. Benim için gerçekten yararlı olacaktır.

Şu anda bu var:

$lines = preg_split("/\r?\n|\r/", $content);  // content is the given page
foreach ($lines as $val) {
  if (preg_match("/(<A(.*)>)(<\/A>)/", $val, $alink)) {     
    $newurl = $alink[1];

    // put in array of found links
    $links[$index] = $newurl;
    $index++;
    $is_href = true;
  }
}

7 Cevap

Standart uyarı geçerlidir: düzenli ifadeler ile HTML Ayrıştırma ideal değildir. Başarı bir karakter-karakter düzeyinde giriş iyi biçimliliğin bağlıdır. Bu garanti edemez eğer, regex noktada Doğruyu yapmak için başarısız olur.

Söyledikten:

<a\b[^>]*>(.*?)</a>   // match group one will contain the link text

Ben regexes büyük bir hayranı değilim, ama bu onları kullanmak için doğru yer değil.

Gerçek bir HTML çözümleyici kullanın.

  • Sizin kod anlaşılır olacak
  • Bu işe daha yatkın olacaktır

Ben bir PHP HTML çözümleyici için Googled ve bulundu this one.

Eğer XHTML ile çalışıyoruz biliyorum, o zaman PHP'nin standart XML ayrıştırıcı kullanabilirsiniz.

<a\s*(.*)\>(.*)</a>

<a href="http://www.stackoverflow.com">Go to stackoverflow.com</a>

1 $ = href = "www.stackoverflow.com"

2 $ = stackoverflow.com git

Ben bir etiket hariç her şeyi şerit benzer bir soruyu yanıtladı here

Regex, kara büyü, yine :)

Ben ortak regex yaklaşık bir nice question bulundu. Eğer senin gibi çok yaygın regexpressions bulacaksınız Orada bazı ilginç bağlantılar.

HTML Etiketler Kapma

< RegexBuddy, belirli bir HTML etiketi açılış ve kapanış çift maçları ile TAG \ b [^>] >(.?) Bu düzenli ifadeye analiz. Etiketleri arasında bir şey ilk geribaşvuru yakalanır. Regex soru işareti bakırdandı yıldız gibi, önce son ilk kapanış etiketinin yerine önce yapardı durur emin olmak için, yıldız tembel yapar. Bu regex düzgün onetwoone gibi, içlerinde yuvalanmış etiketleri maç olmayacak.

<([AZ] [A-Z0-9] )\b[^>]> (. *?) RegexBuddy ile bu düzenli ifadeye analiz herhangi bir HTML etiketi açılış ve kapanış çift maç olacak. Davayı kapatmak için emin olun duyarlılık. bu çözümde anahtar regex geribaşvuru \ 1 kullanılmasıdır. etiketleri arasına şey ikinci geribaşvuru yakalanır. Bu çözüm aynı zamanda kendileri ile iç içe etiketleri maç olmayacak.

Aksi halde: Bu bağlantıyı göz atın: keyword "link". Filtre bağlantıları bazı ilginç yaklaşımlar vardır.

Bu yardımcı olur umarım :)

İyi şanslar!

Eh .. Normal ifadeler kullanma, mükemmel değil, ama perl düzenli ifade

m!<a .*?>(.*?)</a>!i

Eğer davayı görmezden maç grubunda biri, o hat üzerinde ilk bağlantının adını vermelidir.

Sınırlamalar:

  • Tek bir satıra birden bağlantıları işlemek değil
  • Birkaç satır üzerinden gidiyor bağlantıları işlemez.
  • Ayrıca çapa etiketleri maç olacak.

Sen bir satır içine tüm satırları katılarak bu geçici bir çözüm ve daha sonra ayırıcı olarak bağlantı başlangıç ​​kullanarak bir dizi (veya birden fazla hat) bölmek olabilir.

Arasında ne bir listesini oluşturmak için en iyi ve hızlı yolu, preg_match_all kullanmaktır.

Örnek:

$pattern = '#<a[^>]*>([^<]*)<\/a>#';
$subject = '<a href="#">Link 1</a> <a href="#">Link 3</a> <a href="#">Link 3</a>';
preg_match_all($pattern, $subject, $matches);
print_r($matches[1]);

Sonuç şu olacaktır:

Array (
 [0] => Link 1
 [1] => Link 3
 [2] => Link 3
)

Desenin ile

'<a.*?>(.*?)</a>'

Alırsınız

['sign up', 'log in', 'careers 2.0']

Bu biçimlendirme aranıyor:

<span id="hlinks-nav"><a href="/users/login?returnurl=%2fquestions%2f343115%2fregexp-for-finding-everything-between-a-and-a-tags">sign up</a><span class="lsep">|</span><a href="/users/login?returnurl=%2fquestions%2f343115%2fregexp-for-finding-everything-between-a-and-a-tags">log in</a><span class="lsep">|</span><a href="http://careers.stackoverflow.com">careers 2.0</a><span class="lsep">|</span></span>