php preg_replace无法识别该模式

时间:2012-10-13 14:50:04

标签: php regex

我正在尝试制作一个所谓的文本清理器,这样我就可以在不使用strip_tags()函数的情况下删除一些html元素。

我的正则表达式如下:<em>|</em>|<p[^>]*>|</p[^>]*>|<span[^>]*>|</span[^>]*>|<div[^>]*>|</div[^>]*>|&nbsp;|<table[^>]*>(.*?)</table[^>]*>

我的代码如下所示:

$string = "some very messy string here ";
$pattern = '<em>|</em>|<p[^>]*>|</p[^>]*>|<span[^>]*>|</span[^>]*>|<div[^>]*>|</div[^>]*>|&nbsp;|<table[^>]*>(.*?)</table[^>]*>';
$replace = ' ';

$clean =  preg_replace($pattern, $replace, $string);

echo $clean;

由于我无法理解的原因,回声没有回复。

感谢您的时间

更新#1

如果你问我是否想摆脱包含所有内容的表格,答案是肯定的。

2 个答案:

答案 0 :(得分:4)

你的正则表达式需要分隔符。例如:

$pattern = '~<em>|</em>|<p[^>]*>|</p[^>]*>|<span[^>]*>|</span[^>]*>|<div[^>]*>|</div[^>]*>|&nbsp;|<table[^>]*>(.*?)</table[^>]*>~';

阅读分隔符here

另请注意,某些HTML规范(据我所知,除XHTML外)都允许使用大写标记。因此,请考虑为正则表达式添加不区分大小写的修饰符。此外,如果开始标记和结束标记之间存在换行符,则删除表可能不起作用(因为默认情况下.与换行符不匹配)。添加DOTALL修饰符s来解决此问题:

$pattern = '~<em>|</em>|<p[^>]*>|</p[^>]*>|<span[^>]*>|</span[^>]*>|<div[^>]*>|</div[^>]*>|&nbsp;|<table[^>]*>(.*?)</table[^>]*>~is';

最后要注意的是:正如其他人指出的那样,HTML问题的正则表达式解决方案应该采取一些措施。嵌套表会引起问题,评论也会引起问题。如果您非常了解所处理的数据,那么问题可能远比普通HTML复杂得多。但请确保您的代码至少有效,并且您知道所有奇怪的内容,例如嵌套结构和评论中的HTML字符等。

答案 1 :(得分:3)

首先看一下this answer。这应该从一开始就把事情做好。如果您在阅读完答案后仍想继续,我会给您以下内容:

I want to <em<p>>emphasize</<p>em> that it's not possible!

尝试清理它!