【问题标题】:PHP Regex to remove HTML-Tags inside <pre></pre> code blocksPHP Regex 删除 <pre></pre> 代码块中的 HTML-Tags
【发布时间】:2020-09-18 09:38:21
【问题描述】:

我有一个复杂的 HTML 代码字符串,其中包含几个 pre 标记,其中包含代码(例如 python),并且还由应该删除的 HTML 标记修饰。

例如:

Some text.
<pre>
a = 5 <br/>
b = 3
</pre>
More text
<pre>
a2 = "<a href='something'>text</a>"
b = 3
</pre>
final text

我想清除所有 HTML 标签(这些可能是基本标签,br、em、div、a 等)。我不需要解析HTML,我知道regex cannot parse html

Some text.
<pre>
a = 5
b = 3
</pre>
More text
<pre>
a2 = "text"
b = 3
</pre>
final text

我想用 PHP 来做这件事(比如preg_replace)。例如:

$html = "<html><head></head><body><div><pre class=\"some-css-class\">
         <p><strong>
         some_code = 1
         </p></strong>
         </pre></div></body>"; // Compacting things here, for brevity

$newHTML = preg_replace("/(.*?)<pre[^<>]*>(.*?)<\/pre>(.*)/Us", "$1".strip_tags("$2", '<p><a><strong>')."$3", $html);
echo $newHTML;

这个示例代码显然不起作用,因为:(1) 它只适用于一个 pre 标签,(2) 代码 strip_tags("$2", '&lt;p&gt;&lt;a&gt;&lt;strong&gt;') 显然不起作用,因为它不处理字符串正确的位置(它只会返回 "$2" 而不是获取文本并正确操作它)。

关于如何在 PHP 中完成此操作的任何建议?谢谢。

【问题讨论】:

    标签: php html regex preg-replace pre


    【解决方案1】:

    您需要在回调正文中使用preg_replace_callback 并调用strip_tags

    preg_replace_callback('~(<pre[^>]*>)([\s\S]*?)(</pre>)~',
    function ($m) { return $m[1] . strip_tags($m[2], ['p', 'b', 'strong']) . $m[3]; },
    $s);
    
    Some text.
    <pre>
    a = 5
    b = 3
    </pre>
    More text
    <pre>
    a2 = "text"
    b = 3
    </pre>
    final text
    

    请注意,上面的strip_tags 会去除除pbstrong 之外的所有标签。

    正则表达式详细信息:

    • (&lt;pre[^&gt;]*&gt;):匹配 &lt;pre...&gt; 并在 #1 组中捕获
    • ([\s\S]*?):匹配 0 个或多个任何字符,包括换行符(惰性),在 $2 组中捕获它。 [\s\S] 匹配任何字符,包括换行符。
    • (&lt;/pre&gt;):匹配&lt;/pre&gt;并在#3组中捕获

    【讨论】:

    • 太棒了!你能帮忙解释一下代码中的正则表达式吗?
    • 好的,让我在答案中添加它
    猜你喜欢
    • 2018-11-12
    • 1970-01-01
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-23
    相关资源
    最近更新 更多