【问题标题】:html_entity_decode in specific regular expression for a preg_replacepreg_replace 的特定正则表达式中的 html_entity_decode
【发布时间】:2012-10-29 07:44:43
【问题描述】:

我有这个 preg_replace 模式和替换:

$patterns = array(
    "/<br\W*?\/>/",
    "/<strong>/",
    "/<*\/strong>/",
    "/<h1>/",
    "/<*\/h1>/",
    "/<h2>/",
    "/<*\/h2>/",
    "/<em>/",
    "/<*\/em>/",
    '/(?:\<code*\>([^\<]*)\<\/code\>)/',
);
$replacements = array(
    "\n",
    "[b]",
    "[/b]",
    "[h1]",
    "[/h1]",
    "[h2]",
    "[/h2]",
    "[i]",
    "[/i]",
    '[code]***HTML DECODE HERE***[/code]',
);

在我的字符串中,我想html_entity_decode 这些标签之间的内容: &lt;code&gt; &amp;lt; $gt; &lt;/code&gt; 但保留我的数组结构以进行 preg 替换

所以这个:&lt;code&gt; &amp;lt; &amp;gt; &lt;/code&gt; 将是这个:[code] &lt; &gt; [/code]

任何帮助将不胜感激,谢谢!

【问题讨论】:

    标签: php regex decode html-entities bbcode


    【解决方案1】:

    您不能在替换字符串中对此进行编码。正如 PoloRM 建议的那样,您可以使用 preg_replace_callback 专门用于您最后的替换:

    function decode_html($matches)
    {
        return '[code]'.html_entity_decode($matches[1]).'[/code]';
    }
    
    $str = '<code> &lt; &gt; </code>';
    $str = preg_replace_callback('/(?:\<code*\>([^\<]*)\<\/code\>)/', 'decode_html', $str);
    

    等效地,使用create_function:

    $str = preg_replace_callback(
        '/(?:\<code*\>([^\<]*)\<\/code\>)/',
        create_function(
           '$matches',
            'return \'[code]\'.html_entity_decode($matches[1]).\'[/code]\';'
        ),
        $str
    );
    

    或者,从 PHP 5.3.0 开始:

    $str = preg_replace_callback(
        '/(?:\<code*\>([^\<]*)\<\/code\>)/',
        function ($matches) {
            return '[code]'.html_entity_decode($matches[1]).'[/code]';
        },
        $str
    );
    

    但请注意,在所有三种情况下,您的模式都不是最佳的。首先,您不需要转义那些&lt;&gt;(但这只是为了便于阅读)。其次,您的第一个* 允许无限重复(或省略)字母e。我想你想允许属性。第三,您不能在&lt;code&gt; 中包含其他标签(因为[^&lt;] 不会匹配它们)。在这种情况下,也许您应该使用不贪婪的重复来代替(为方便起见,我还更改了分隔符):

    ~(?:<code[^>]*>(.*?)</code>)~
    

    正如您已经看到的那样,这仍然远非完美(就首先正确匹配 HTML 而言)。因此,强制性提醒:don't use regex to parse HTML。使用 DOM 解析器会更好。 PHP带来了built-in one,还有this very convenient-to-use 3rd-party one

    【讨论】:

    • 感谢您的回答,我想我会考虑使用 DOM 解析器,但它有点复杂:p
    • @user990463,尤其是我链接的第二个,实际上并没有那么复杂。它非常易于使用(只需转到他们的文档并查看一些示例)。
    • 是的,我希望使用这个,但出于技术问题(不取决于我)我无法安装第 3 方扩展 :(
    • @user990463 啊,我明白了。这确实使它更加费力,但是如果您想创建一个健壮的应用程序,这绝对是必要的(想想属性字符串或 HTML cmets 中的 HTML 标记......任何正则表达式解决方案都会严重扼杀这些;甚至不说无效HTML 通常可以由 DOM 解析器部分处理)
    • 是的,我同意这一点,正则表达式并不真正适合复杂的 HTML 替换思想。所以我会进入 PHP DOM Parsing ;) 谢谢你的建议!
    【解决方案2】:

    看看这个:

    http://www.php.net/manual/en/function.preg-replace-callback.php

    您可以创建一个回调函数,将 html_entity_decode 功能应用于您的比赛。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-09
      • 2011-05-20
      • 2016-07-11
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多