Bir preg_match'in yılında adını almak nasıl

2 Cevap php

Ben sadece isimler altında hipotetik HTML dosyasından sonucu ayıklamak çalışıyorum.

<ul class="cat">
<li>sport</li>
<li>movie</li>
</ul>
<ul class="person-list">
<li>name 1</li>
<li>name 2</li>
<li>name 3</li>
<li>name 4</li>
<li>name 5</li>
<li>name 6</li>
</ul>

Ideally, the result should come in an array format like the one below: Array( name 1 , name 2 , name 3 , .......... )

Tamam ben kolayca 2 regex maçları ile yapabilirsiniz ama ben sadece bir ile bunu yapabilir merak ediyordum.

2 Cevap

Bu DOMDocument gibi bir HTML çözümleyici kullanarak çok daha kolay ve çok daha sağlam olurdu. Regexes HTML regular language olmadığından HTML ayrıştırma için kötü bir araçtır. Böyle bir şey deneyin:

$html = <<<END
<ul class="cat">
<li>sport</li>
<li>movie</li>
</ul>
<ul class="person-list">
<li>name 1</li>
<li>name 2</li>
<li>name 3</li>
<li>name 4</li>
<li>name 5</li>
<li>name 6</li>
</ul>
END;
$dom = new DOMDocument;
$dom->loadHTML($html);
$xpath = new DOMXpath($dom);
$items = $xpath->query("//li[starts-with(.,'name ')]/text()");
foreach ($items as $item) {
  echo $item->wholeText . "\n";
}

Çıktı:

name 1
name 2
name 3
name 4
name 5
name 6

İşte bunu yapmak için örnek bir perl script. Html'nizi varsayarsak my.html olduğunu

open FILE, "<", "my.html" or die $!;
my @arr;
while (my $line = <FILE>) {
  if ($line =~ /<li>\s*(name[^>]+)<\/li>/) {
     push(@arr, $1);
  }
}
print "Array (@arr)\n";

Açıklama - html dosyasının her satırı $ hattına okuyun ve sonra biz regex kullanmak olduğunu

/<li>\s*(name[^>]+)<\/li>/

akım hattı biz (li etiketleri içine kapalı dizesi 'bazı karakterler tarafından takip adı' yani) ne istediğinizi maçları görmek için. Aynı anda "bazı karakterlerin ardından adı" alt dizesi geribaşvuru yakalanır. Bir eşleştirme bulursanız, yakalanan dize dizisine eklenir.