2012-10-13 46 views
1

我想制作一个所谓的文本清理器,以便我可以摆脱一些html元素而不使用strip_tags()函数。php preg_replace不识别图案

我正则表达式是这样的:<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

如果你问我是否想摆脱的表里面他们的所有内容,答案是肯定的。

+0

这段代码的目标是什么 - 为什么你想避免使用strip_tags? – AD7six

+0

Strip标签不会删除我想要做的表格的内容。 – Mike

+0

你最好不要使用正则表达式来伪解析html。条形标签会剥离标签,并且如果您想要删除表格 - 将例程写入远程表格。你会得到奇怪的结果,例如:“

...
...
...”。 – AD7six

回答

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字符等等。

+0

这样做,但我认为正则表达式的定义中有些东西被打破,因为它不会删除表格。 – Mike

+1

'.'默认不匹配换行符。在'i':'s'之后添加另一个修饰符。它被称为DOTALL修饰符,现在点也将匹配linebreaks ...我将它添加到答案 –

3

首先看看this answer。这应该从一开始就把事情做好。如果你读过的答案后,仍然要继续,我给你以下几点:

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

试图清理的!

+1

从技术上讲,他并不试图解析它。此外,这是甚至有效的HTML?如果是这样,这将是什么语义。最后你可以解决它,通过声明在关闭'>'之前也没有''''开始,然后多次运行替换。 –

+0

不能同意更多!但是这里的数据看起来相当统一,我必须在这个正则表达式之间进行选择,或者手动清理大约5000个文章,这不会很聪明或者有效。 – Mike

+1

@ m.buettner你甚至读过我发布的链接吗?我不在乎它是否是有效的HTML,它不是客户(不是黑客)提供有效HTML的责任。继续,拿出一个能够捕捉我的句子的正则表达式,我会用更复杂的句子回复你,hrhrhr。 – aefxx