使用preg match和replace来替换ol标签中的li标签

时间:2011-01-29 06:54:41

标签: php tags preg-replace preg-match preg-replace-callback

这是我得到的:

<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标签内替换它。可能是什么问题,我该如何解决?

2 个答案:

答案 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)