正则表达式删除空的<span>标记</span>

时间:2008-11-15 13:07:23

标签: php html regex

我希望删除这样的空span标记(填充&nbsp;和空格):

<span> &nbsp; &nbsp; &nbsp; </span>

我试过这个正则表达式,但需要调整:

(<span>(&nbsp;|\s)*</span>)

preg_replace('#<span>(&nbsp;|\s)*</span>#si','<\\1>',$encoded);

7 个答案:

答案 0 :(得分:5)

将Kent Fredric的regexp翻译成PHP:

preg_match_all('#<span[^>]*(?:/>|>(?:\s|&nbsp;)*</span>)#im', $html, $result);

这将匹配:

  • autoclosing spans
  • 跨越多线,无论如何
  • 跨越属性
  • 跨越坚不可摧的空间

也许您应该包括仅包含<br />的跨度......

像往常一样,在调整regexp时,一些工具很方便:

http://regex.larsolavtorvik.com/

答案 1 :(得分:2)

qr{<span[^>]*(/>|>\s*?</span>)}

应该得到他们的要点。 (包括XML样式 - 自闭项标记,即:)

但是真的不应该使用正则表达式进行HTML处理。

仅回答与更正格式错误之前可见问题的上下文相关的问题

答案 2 :(得分:1)

我认为这些跨度是由某些程序生成的,因为它们似乎没有任何属性 我很困惑为什么你需要把它们放在尖括号之间的空间,但是我又不知道代码的最终目的。
我认为解决方案是肯特给出的:你必须让比赛变得非贪婪:因为你使用了dotall选项,你将匹配第一个跨度和最后一个结束跨度之间的所有内容!

所以答案应该是这样的:

preg_replace('#<span>(&nbsp;|\s)*?</span>#si', '<$1>', $encoded);

(未测试的)

答案 3 :(得分:1)

  

我试过这个正则表达式,但需要调整:

原始问题中的正则表达式以何种方式失败?

  

跨度越来越大的问题出现了   嵌套如:<span><span> &nbsp; </span></span>

这是为什么使用正则表达式来解析HTML不能很好地工作的一个例子。根据你的正则表达式风格,这种情况要么不能一次性处理,要么只是非常困难。我不知道PHP的正则表达式引擎是否足以说明它属于哪个类别,但是,如果唯一的问题是它取出了内部<span>并且只留下外部的那个,那么你可能只想考虑一下重复重新运行替换,直到完成任务为止。

答案 4 :(得分:0)

如果您唯一的问题是嵌套的span标记,则可以使用循环中的正则表达式进行搜索和替换,直到正则表达式不再找到任何匹配项。

这可能不是一个非常优雅的解决方案,但它的表现还不错。

答案 5 :(得分:0)

这是我的嵌套标签问题的解决方案,仍然不完整但关闭......

$test="<span>   <span>& nbsp;  </span>  test <span>& nbsp; <span>& nbsp;  </span>  </span> & nbsp;& nbsp; </span>";

$pattern = '#<(\w+)[^>]*>(& nbsp;|\s)*</\1>#im';      
while(preg_match($pattern, $test, $matches, PREG_OFFSET_CAPTURE)!= 0)
{$test= preg_replace($pattern,'', $test);}

对于简短的$ test语句,该功能正常。尝试使用长文本时出现问题。任何帮助将不胜感激......

答案 6 :(得分:0)

稍微修改e-satisf'答案:

function remove_empty_spans($html_replace)
{
$pattern = '/<span[^>]*(?:\/>|>(?:\s|&nbsp;)*<\/span>)/im';
return preg_replace($pattern, '', $html_replace);
}

这对我有用。