如何匹配特定所有<li>标签之间的内容?</li>

时间:2011-06-06 16:21:34

标签: php regex

如何匹配所有&lt; li&gt;以下HTML代码中的标记:

<ul>
<li> some content</li>
<li> some other content</li>
<li> some other other content.</li>
</ul>

此表达式不起作用:

&LT;李&GT;&LT(*); /立GT;

因为它返回:

some content</li>
    <li> some other content</li>
    <li> some other other content.

第一个&lt; li&gt;之间的内容是什么?和最后一个&lt; / li&gt;

7 个答案:

答案 0 :(得分:6)

正则表达式本质上是贪婪的。通过添加?来使其变得非贪婪。

<li>(.*?)</li>

注意:我鼓励DOM Parser这样做。查看PHP's DOMDocument

答案 1 :(得分:2)

有人请链接Regex HTML Parser问题......

存在HTML解析器的原因,即解析HTML。

这个解决方案有点长,但它是多功能的,适用于带有类,ID等的元素:

<?php

function innerHTML($node) {
  $doc = new DOMDocument();

  foreach ($node->childNodes as $child) {
    $doc->appendChild($doc->importNode($child, true));
  }

  return $doc->saveHTML();
}

$string = "<ul>
<li> some content</li>
<li> some other content</li>
<li> some other other content.</li>
</ul>";

$document = new DOMDocument();
$document->loadHTML($string);

$ul = $document->getElementsByTagName("ul");

foreach ($ul as $element) {
  print innerHTML($element);
}

?>

好像你不需要标签名称。试试这个更简单的代码:

<?php

$string = "<ul>
<li> some content</li>
<li> some other content</li>
<li> some other other content.</li>
</ul>";

$document = new DOMDocument();
$document->loadHTML($string);

$ul = $document->getElementsByTagName("li");

foreach ($ul as $element) {
  print $element->nodeValue;
}

?>

答案 2 :(得分:1)

尝试使用.*?而不是.* - 它是懒惰或非贪婪的匹配,并尽可能少地匹配。

对@CanSpice的回应:

当然正则表达式不适合HTML。 OP应该尝试<li>(?!.*<li>).*?</li>之类的东西,这取决于他在做什么。或者更确切地说使用解析器。我一次只能指导OP一步

答案 3 :(得分:0)

尝试使正则表达式非贪婪

<li>(.*?)</li>

答案 4 :(得分:0)

由于您要匹配HTML文本,我建议至少使用si这样的标记:

'~<li>(.*?)</li>~is'
  • 用于DOTALL使点.匹配所有字符,包括新行
  • 我用于忽略大小写匹配

答案 5 :(得分:0)

<?php
$str = '<ul>
<li> some content</li>
<li> some other content</li>
<li> some other other content.</li>
</ul>';

preg_match_all('/<li>([^<]+)</li>/i', $str, $r); print_r($r[1]); ?>

输出:

`Array
(
    [0] =>  some content
    [1] =>  some other content
    [2] =>  some other other content.
)
`

答案 6 :(得分:0)

var a = '<ul>'+
'<li> some content</li>'+
'<li> some other content</li>'+
'<li> some other other content.</li>'+
'</ul>'

a.split("<li>") 
gives
["<ul>", " some content</li>", " some other content</li>", " some other other content.</li></ul>"]

从那里我们可以选择我们想要的任何东西。