PHP 正则表达式用于删除代码块内的 <pre></pre> HTML 标记



我有一个棘手的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无法解析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(它只适用于一个预标记,(2(代码strip_tags("$2", '<p><a><strong>')显然不起,因为它没有在正确的位置处理字符串(它只会返回"$2",而不是获取文本并正确操作它(。

关于如何在PHP中实现这一点,有什么建议吗?谢谢

您需要使用preg_replace_callback并在回调主体中调用strip_tags

preg_replace_callback('~(<pre[^>]*>)([sS]*?)(</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之外的所有标签。

RegEx详细信息:

  • (<pre[^>]*>):匹配<pre...>并在组#1中捕获
  • ([sS]*?):匹配0个或多个任何字符,包括换行符(lazy(,将其捕获到组$2中。[sS]匹配包括换行符在内的任何字符
  • (</pre>):匹配</pre>并在组#3中捕获

最新更新