PHP Regex删除HTML-Tag

时间:2015-08-11 21:00:09

标签: php regex

我正在寻找一种在PHP中搜索字符串的方法,并删除"<pre""</pre>"以及介于两者之间的所有内容。

示例:

$string = 'Hello, I am a little text. <pre class="foo">This should be deleted.</pre> This is fine again.';
// Some magic function
$newString = 'Hello, I am a little text.  This is fine again.';

有什么办法吗?如果我使用strip_tags(),则只删除标记,但现在删除标记内的内容。

非常感谢!

2 个答案:

答案 0 :(得分:4)

如果它只是一个小字符串,我不推荐它,但正则表达式会在这里好。

$newString = preg_replace('~<pre[^>]*>[^<]*</pre>~', '', $str);

但是,在处理HTML / XML时,我总是使用DOM

$doc = new DOMDocument;
$doc->loadHTML($html);

foreach ($doc->getElementsByTagName('pre') as $tag) {
   $tag->parentNode->removeChild($tag);
}

答案 1 :(得分:3)

我使用下面(或上面)的@hwnd解析示例,比使用正则表达式更安全。

您可以使用以下内容:

/<(.*?)(\h*).*?>(.*?)<\/\1>/

演示:https://regex101.com/r/cN9rL4/3

PHP演示:https://eval.in/415470

echo preg_replace('/<(.*?)(\h*).*?>(.*?)<\/\1>/s', '', 'Hello, I am a little text. <pre class="foo">This should be deleted.</pre> This is fine again.');

输出:

  

您好,我是一个小文字。这很好。

修改:添加s修饰符以防内容超过一行,演示失败https://regex101.com/r/cN9rL4/2

另请注意,这不是pre特有的,这将替换它遇到的任何元素。