Dizeden PHP Başlık etiketlerini ayıklamak nasıl

7 Cevap php

Ben yeni bir değişken haline <h1><h2>etc etiketleri tüm metin ayıklamak nasıl HTML, bir sürü içeren bir dize.

Muhtemelen preg_match_all kullanarak ve tek bir virgülle ayrılmış değişken eşleşmeleri gönderiyor.

Teşekkürler çocuklar.

7 Cevap

Aslında normal ifadeler kullanmak istiyorsanız, ben düşünüyorum:

preg_match_all('/<h[0-6]>([^</h[0-6]>*)</h/i', $string, $matches);

sürece başlık etiketleri iç içe değil gibi çalışması gerekir. Diğerleri söylediler gibi HTML kontrol değilseniz, düzenli ifadeler bunu yapmak için harika bir yol değildir.

Öncelikle düzenli ile HTML (örnekte $ html_str) temizlemek gerekir:

$tidy_config = array(
    "indent"               => true,
    "output-xml"           => true,
    "output-xhtml"         => false,
    "drop-empty-paras"     => false,
    "hide-comments"        => true,
    "numeric-entities"     => true,
    "doctype"              => "omit",
    "char-encoding"        => "utf8",
    "repeated-attributes"  => "keep-last"
);

$xml_str = tidy_repair_string($html_str, $tidy_config);

Sonra bir DOMDocument içine XML ($ xml_str) yükleyebilirsiniz:

$doc = DOMDocument::loadXML($xml_str);

Ve nihayet Horia Dragomir yöntemi kullanabilirsiniz:

$list = $doc->getElementsByTagName("h1");
for ($i = 0; $i < $list->length; $i++) {
    print($list->item($i)->nodeValue . "<br/>\n");
}

Ya da (bkz. http://www.php.net/manual/en/class.domxpath.php) DOMDocument daha karmaşık sorgular için XPath kullanabilirsiniz

$xpath = new DOMXPath($doc);
$list = $xpath->evaluate("//h1");

Soru "nasıl HTML şeyler ayıklamak" olduğunda, cevap normal ifadeler kullanmak ASLA. Bunun yerine, Robust, Mature HTML Parser for PHP üzerine tartışma bakın.

Bu iş için regex kullanmak ve SimpleHTMLDOM parser şey kullanmak tavsiye edilir

Muhtemelen bir HTML çözümleyici kullanarak daha iyisin. Ama gerçekten basit senaryolar için, böyle bir şey yapacağım:

if (preg_match_all('/<h\d>([^<]*)<\/h\d>/iU', $str, $matches)) {
    // $matches contains all instances of h1-h6
}

Ben ancak ben topluca başlık etiketlerini kapmak başardı iyi bir şekilde söz etmek istedim, bu bir süper eski bir yazı olduğunu biliyorum.

<h1>title</h1> and <h2>title 2</h2>

Bu yöntem (bir regex olarak çalışır, ancak PHP biraz farklı davranır.)

/<\s*h[1-2](?:.*)>(.*)</\s*h/i

use this in your preg_match

|<\s*h[1-2](?:.*)>(.*)</\s*h|Ui

$group[1] will include what ever is in between the heading tag. $group[0] is everything <h1>test</h

Bu alanlar için hesap olacak ve birisi "class / id" ekler

<h1 class="classname">test</h1>

sınıf / id (grup) göz ardı edilir.

NOTE: Ben HTML etiketlerini analiz edildiğinde, ben her zaman dışarı şerit ve 1 boşluk ile tüm beyaz boşluk, satır araları vb sekmeleri değiştirin.. Bu çok-hatları, dotalls ... Ve boşluk çok büyük miktarlarda en aza indirir, bazı durumlarda can regex biçimlendirme ile karışıklık.

  • tabii ki sadece 1-2 başlık etiketlerini kapma ediyorum, tüm kapmak için 0-9 bu değiştirebilirsiniz.
  • Başkasının kodumu eklemek için bir mod ya da bir düzeltme varsa, ben gerçekten bilmek istiyorum, lütfen cevap verin.
  • Regex HTML ile kötü olmak ile Aksine, bu çok açık bir argümandır. Eğer php fonksiyonları ve regex ifadeleri tasarım eğer mükemmel önemsiz kaldırdığını ve regex özel ifadeler için html hazırlamak çünkü, Sizin için ne arıyorsanız kapmak mükemmel mümkün olacaktır. Sen amatör html işi yerine yeterli regex işlevleri yapabilirsiniz.

İşte test sayfasında bir link regex test