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
去除了除 p
、b
和 strong
之外的所有标签。
正则表达式详细信息:
(<pre[^>]*>)
:匹配 <pre...>
并在组 #1 中捕获
([\s\S]*?)
:匹配0个或多个任意字符,包括换行符(惰性),在$2组中捕获。 [\s\S]
匹配任何字符,包括换行符。
(</pre>)
:匹配 </pre>
并在组 #3 中捕获
我有一个棘手的 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
去除了除 p
、b
和 strong
之外的所有标签。
正则表达式详细信息:
(<pre[^>]*>)
:匹配<pre...>
并在组 #1 中捕获
([\s\S]*?)
:匹配0个或多个任意字符,包括换行符(惰性),在$2组中捕获。[\s\S]
匹配任何字符,包括换行符。(</pre>)
:匹配</pre>
并在组 #3 中捕获