如何匹配所有< li>以下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;
答案 0 :(得分:6)
答案 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文本,我建议至少使用s
和i
这样的标记:
'~<li>(.*?)</li>~is'
.
匹配所有字符,包括新行答案 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>"]
从那里我们可以选择我们想要的任何东西。