这是我得到的:
<ol>
<li></li>
<li></li>
</ol>
<ul>
<li></li>
<li></li>
</ul>
if (preg_match("/<ol>.*(<li(|\s*\/)>).*<\/ol>/Ums", $text->Bodytext)) {
$cleanlist = preg_replace("/(<li(|\s*\/)>)/", "<li><tag>", $text->Bodytext);
如果页面只包含ol标签,这个php代码效果很好,但如果它由于某种原因同时包含ul和ol标签,它也会在ul标签内部更改li标签,我只希望它在ol标签内替换它。可能是什么问题,我该如何解决?
答案 0 :(得分:0)
正则表达式中的问题可能是贪婪。您应该在.*?
附加一个问号,以便匹配较少的填充。
$html = preg_replace_callback('#<ol>(.*?)</ol>#Us', "change_li", $html);
function change_li($m) {
return preg_replace('#<li>#', '<li><tag>', $m[0]);
}
现在,在模因海报出现之前,使用正则表达式并不是最可靠的方法。除非你有古怪的HTML,否则它在你的情况下是可行的。另一种方法是使用phpQuery or QueryPath,但匹配就像qp($html)->find("ol")->find("li")
一样简单。虽然实际的替换会更多地涉及这种方法。
答案 1 :(得分:0)
在PHP 5.3中,此任务可以按如下方式完成:
$input = <<<END
<ol>
<li></li>
<li></li>
</ol>
<ul>
<li></li>
<li></li>
</ul>
END;
$result = preg_replace_callback(
"/(<ol>.*<\/ol>)/Ums",
function ($ol) {
return preg_replace("/(<li(|\s*\/)>)/", "<li><tag>", $ol[1]);
},
$input
);
var_dump($result);
输出结果为:
string '<ol>
<li><tag></li>
<li><tag></li>
</ol>
<ul>
<li></li>
<li></li>
</ul>' (length=72)