如何从PHP字符串中删除所有HTML标记?

时间:2016-08-26 04:47:49

标签: php html regex string

我有一个像这样的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()也无法正常工作。

2 个答案:

答案 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`

可以是两个代码行,中间有一个句子,也可以是带换行符的代码。到目前为止,您的问题描述在该部分尚不清楚。这也可能意味着你没有充分理解这个问题。

最后,最安全的解决方案是一个解析器,你可以对实际发生的事情进行细致的控制,因为正则表达式似乎总是有一个边缘情况,它们会失败或出现意外行为。