我正在尝试制作一个所谓的文本清理器,这样我就可以在不使用strip_tags()
函数的情况下删除一些html元素。
我的正则表达式如下:<em>|</em>|<p[^>]*>|</p[^>]*>|<span[^>]*>|</span[^>]*>|<div[^>]*>|</div[^>]*>| |<table[^>]*>(.*?)</table[^>]*>
我的代码如下所示:
$string = "some very messy string here ";
$pattern = '<em>|</em>|<p[^>]*>|</p[^>]*>|<span[^>]*>|</span[^>]*>|<div[^>]*>|</div[^>]*>| |<table[^>]*>(.*?)</table[^>]*>';
$replace = ' ';
$clean = preg_replace($pattern, $replace, $string);
echo $clean;
由于我无法理解的原因,回声没有回复。
感谢您的时间
更新#1
如果你问我是否想摆脱包含所有内容的表格,答案是肯定的。
答案 0 :(得分:4)
你的正则表达式需要分隔符。例如:
$pattern = '~<em>|</em>|<p[^>]*>|</p[^>]*>|<span[^>]*>|</span[^>]*>|<div[^>]*>|</div[^>]*>| |<table[^>]*>(.*?)</table[^>]*>~';
阅读分隔符here。
另请注意,某些HTML规范(据我所知,除XHTML外)都允许使用大写标记。因此,请考虑为正则表达式添加不区分大小写的修饰符。此外,如果开始标记和结束标记之间存在换行符,则删除表可能不起作用(因为默认情况下.
与换行符不匹配)。添加DOTALL修饰符s
来解决此问题:
$pattern = '~<em>|</em>|<p[^>]*>|</p[^>]*>|<span[^>]*>|</span[^>]*>|<div[^>]*>|</div[^>]*>| |<table[^>]*>(.*?)</table[^>]*>~is';
最后要注意的是:正如其他人指出的那样,HTML问题的正则表达式解决方案应该采取一些措施。嵌套表会引起问题,评论也会引起问题。如果您非常了解所处理的数据,那么问题可能远比普通HTML复杂得多。但请确保您的代码至少有效,并且您知道所有奇怪的内容,例如嵌套结构和评论中的HTML字符等。
答案 1 :(得分:3)
首先看一下this answer。这应该从一开始就把事情做好。如果您在阅读完答案后仍想继续,我会给您以下内容:
I want to <em<p>>emphasize</<p>em> that it's not possible!
尝试清理它!