1

我正在尝试制作一个所谓的文本清洁器,以便在不使用该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

如果您问我是否要删除包含所有内容的表格,答案是肯定的。

4

2 回答 2

4

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

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

在此处阅读分隔符。

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

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

最后一点:正如其他人指出的那样,对 HTML 问题的正则表达式解决方案应该持保留态度。嵌套表会导致问题,注释也会。如果您非常了解要处理的数据,那么问题可能比一般 HTML 简单得多。但请确保您的代码至少是有效的,并且您知道所有奇怪的东西,例如嵌套结构和注释中的 HTML 字符等等。

于 2012-10-13T14:52:45.733 回答
3

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

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

试着清理它!

于 2012-10-13T14:59:08.170 回答