我有一个像这样的PHP字符串:
$string = "<b class='classname'>this</b> is a `<a href='#'>link</a>`
<p>and this is a test</p>
Also this is <i>another</i> test.";
我想要这个输出:
$string = "this is a `<a href='#'>link</a>`
<p>and this is a test</p>
Also this is another test.";
如您所见,我想删除所有HTML标记,但不包括:
注意:我可以使用strip_tags()
删除所有HTML标记,但它也会删除那些不应删除的标记。 htmlspecialchars()
也无法正常工作。
答案 0 :(得分:2)
这很难看,但是在这个例子上工作
<?php
function translate($m) {
if(isset($m[1]) && $m[1] != "") {
$m[0] = str_replace($m[1], "", $m[0]);
return strip_tags($m[1]).$m[0];
}else {
return strip_tags($m[0]);
}
}
$re = "/(.*)`.*`|\n((?<![[:space:]]{4})(.*)\n)/m";
$string = "this is a `<a href='#'>link</a>`
<p>and this is a test</p>
Also this is another test.";
$string = $string.$string.$string.$string;
echo preg_replace_callback($re, "translate", $string);
?>
输出:
this is a `<a href='#'>link</a>`
<p>and this is a test</p>
Also this is another test.this is a `<a href='#'>link</a>`
<p>and this is a test</p>
Also this is another test.this is a `<a href='#'>link</a>`
<p>and this is a test</p>
Also this is another test.this is a `<a href='#'>link</a>`
<p>and this is a test</p>
Also this is another test.
答案 1 :(得分:1)
正如我所看到的,要正确地执行此操作,您应该使用/编写解析器。如果您完全可以信任输入(大约99.9%的情况下不能),有两种方法可能对您有吸引力。
您可以匹配`(.*)`|\n .*\n
并将其替换为唯一占位符,strip_tags
替换字符串(基本上)并将原始代码放回原位。
preg_split
能够记住分隔符(另请参阅链接页面上的注释)。所以基本上你可以将`(.*)`|\n .*\n
声明为分隔符,然后通过strip_tags
每个其他条目输出数组。
你应该记住,总有一些边缘情况。在我看来,你想复制堆栈溢出的语法。 SO的语法也有<code>...</code>
标记代码作为代码,以及<pre></pre>
来排版其中一些代码。当你想在反推中做`
时会出现问题,这是通过使用双反引号作为介绍(并且之前会破坏两种方法)来完成的。另外,SO的语法是,在缩进代码块之前,你只有两个换行符。
某些输入并不明确。例如,
怎么样? `something to dream about
but I want to show
that everything's simple`
可以是两个代码行,中间有一个句子,也可以是带换行符的代码。到目前为止,您的问题描述在该部分尚不清楚。这也可能意味着你没有充分理解这个问题。
最后,最安全的解决方案是一个解析器,你可以对实际发生的事情进行细致的控制,因为正则表达式似乎总是有一个边缘情况,它们会失败或出现意外行为。