我有一个复杂的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", "$1".strip_tags("$2", '<p><a><strong>')."$3", $html);
echo $newHTML;这个示例代码显然不起作用,因为:(1)它只适用于一个预标记,(2)代码strip_tags("$2", '<p><a><strong>')显然不能工作,因为它没有在正确的位置处理字符串(它只返回"$2“,而不是获取文本并正确地操作它)。
对于如何在PHP中做到这一点,有什么建议吗?谢谢。
发布于 2020-09-18 10:07:25
您需要在回调体中使用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以外的所有标记。
RegEx详细信息:
(<pre[^>]*>):匹配#1([\s\S]*?):匹配0或更多字符(包括换行符)中的<pre...>和捕获,在组$2中捕获。[\s\S]匹配任何字符,包括newline.(</pre>):匹配</pre>和第3组中的捕获。
https://stackoverflow.com/questions/63953206
复制相似问题