XHTML etiketleri içerik Başlarken: dizeden p ul ve / veya ol

3 Cevap php

Ben oldukça iyi xhtmli üreten bir WYSIWYG editörü ile bir CMS var. Bu gerçeğine dayanarak, ben bir HTML çözümleyici bu küçük iş için biraz overkill olabileceğini düşünüyorum.

Ben normal ifadeler kullanmak niyetinde değilim ama şimdiye kadar benim ben sonra ben ne maç almak mümkün olmuştur.

Ben PHP5 kullanıyorum.

Ben WYSIWYG editörü üretebiliyor 3 blok düzeyindeki öğelerin içeriğini maç gerekir: p ul & ol. Şu anda () preg_match_all kullanıyorum.

Bana yardım edebilir kimse var mı?

Teşekkür ederim

3 Cevap

Bu sürece p / ul / ol etiketleri iç içe yok gibi çalışması gerekir:

preg_match_all("<(?:p|ul|ol)>(.*?)</(?:p|ul|ol)>", $string, $matches)

?: $matches dahil ve .*? başka etiketinin sonunun eşleştirme regex engeller olmaktan Pars şey önler.

Ben sadece bunu anladım düşünüyorum

preg_match_all('/<(p|ul|ol)>(.*)<\/(p|ul|ol)>/iU', $content, $blockElements);

Bu sürece ul p etiketleri veya ul yuva p etiketleri Yüklü olarak her etiketin üstteki bulabilirsiniz. Ama örneğin ul yuva s olabilir. Karmaşık html için, DOM ile daha iyi.

Örnek veri:

$html = <<< EOF
<p>
 hey
</p>

<ul>
 <li>
  test 
 </li>
 <li>
  <p>
   df4r4 4f4
  </p>
 </li>
</ul>

<p>
 hoo
</p>

EOF;

Regex:

$regex = '#<(?P<tags>(?i)p|ul|ol)>(?P<values>.*?)</\1>#si';
preg_match_all($regex, $html, $output);

Sıralama etiketleri:

for ($i = 0, $t = count($output['tags']); $i < $t; $i++) {
    $out[$output['tags'][$i]][] = $output['values'][$i];
}

Etiketler ve değerler ayrı ayrı tamsayı anahtarı ve bütün çizgi maç ile çiftleri kaldırın:

$output = array_intersect_key($output, array('tags' => 0, 'values' => 0));