PHP 正则表达式删除 HTML-<pre></pre> 代码块内的标签

PHP Regex to remove HTML-Tags inside <pre></pre> code blocks

我有一个棘手的 HTML 代码字符串,其中包含几个预标记,其中包含代码(例如,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", "".strip_tags("", '<p><a><strong>')."", $html);
echo $newHTML;

这个示例代码显然不起作用,因为:(1) 它只适用于一个前置标签,并且 (2) 代码 strip_tags("", '<p><a><strong>') 显然不起作用,因为它不进行处理正确位置的字符串(它只是 return "$2" 而不是获取文本并正确操作它)。

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

您将需要使用 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 之外的所有标签。

正则表达式详细信息:

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