我希望删除这样的空span标记(填充
和空格):
<span> </span>
我试过这个正则表达式,但需要调整:
(<span>( |\s)*</span>)
preg_replace('#<span>( |\s)*</span>#si','<\\1>',$encoded);
答案 0 :(得分:5)
将Kent Fredric的regexp翻译成PHP:
preg_match_all('#<span[^>]*(?:/>|>(?:\s| )*</span>)#im', $html, $result);
这将匹配:
也许您应该包括仅包含<br />
的跨度......
像往常一样,在调整regexp时,一些工具很方便:
答案 1 :(得分:2)
qr{<span[^>]*(/>|>\s*?</span>)}
应该得到他们的要点。 (包括XML样式 - 自闭项标记,即:)
但是真的不应该使用正则表达式进行HTML处理。
仅回答与更正格式错误之前可见问题的上下文相关的问题
答案 2 :(得分:1)
我认为这些跨度是由某些程序生成的,因为它们似乎没有任何属性
我很困惑为什么你需要把它们放在尖括号之间的空间,但是我又不知道代码的最终目的。
我认为解决方案是肯特给出的:你必须让比赛变得非贪婪:因为你使用了dotall选项,你将匹配第一个跨度和最后一个结束跨度之间的所有内容!
所以答案应该是这样的:
preg_replace('#<span>( |\s)*?</span>#si', '<$1>', $encoded);
(未测试的)
答案 3 :(得分:1)
我试过这个正则表达式,但需要调整:
原始问题中的正则表达式以何种方式失败?
跨度越来越大的问题出现了 嵌套如:
<span><span> </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| )*<\/span>)/im';
return preg_replace($pattern, '', $html_replace);
}
这对我有用。