【问题标题】:use preg match and replace to replace li tags within ol tags使用 preg match 和 replace 替换 ol 标签中的 li 标签
【发布时间】:2011-01-29 06:54:41
【问题描述】:

这是我得到的:

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

【问题讨论】:

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


【解决方案1】:

您的正则表达式中的问题可能是贪婪。你应该在.*? 后面加上一个问号,这样它就可以匹配更少的填充。

但是,如果您没有尝试使用单个正则表达式来完成它,它会更可靠。这总是比走简单的路线多一点:

$html = preg_replace_callback('#<ol>(.*?)</ol>#Us', "change_li", $html);
function change_li($m) {
    return preg_replace('#<li>#', '<li><tag>', $m[0]);
}

现在,在 meme 海报出现之前,使用正则表达式并不是最可靠的方法。除非您有古怪的 HTML,否则它在您的情况下是可行的。另一种方法是使用phpQuery or QueryPath,但是匹配就像qp($html)-&gt;find("ol")-&gt;find("li") 一样简单。虽然实际替换会更多地涉及这种方法。

【讨论】:

  • 好的,在尝试让此代码在网站上运行后,我遇到了一些错误。我用 $text->Bodytext 替换了 $html,因为这是我在站点中需要的,并收到此错误“警告:preg_replace_callback() [function.preg-replace-callback]: Requires argument 2, 'change_li', to be a有效回调”
  • @user585303:它必须是一个函数。如果您将其添加为方法,则回调必须是 array($this,"change_li") 或其他。
  • 另一个有趣的故事,这里是案例
      1. abc
    • ghi
    • jkl
  • def
  • 当我在 ol 中有 ol 时,它会停止工作,或者它也会停止转换第一个 ol 标记中的其他 li,有什么建议吗?
  • @user585303: 用正则表达式来完成你的任务太麻烦了。然后使用推荐的phpQuery。
  • 【解决方案2】:

    在 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)
    

    【讨论】:

      猜你喜欢
      相关资源
      最近更新 更多
      热门标签