Php 用于删除空标记的正则表达式

Php 用于删除空标记的正则表达式,php,html,regex,Php,Html,Regex,我希望删除此类空白的跨度标签,其中包含以下内容和空间: 我已尝试使用此正则表达式,但它需要调整: |\s* preg_替换“|\s*si”,$encoded 你应该了解他们的要点。包括XML样式的自动关闭标记,即: 但是你真的不应该在HTML处理中使用正则表达式 答案仅与更正格式错误之前可见的问题上下文相关 你应该了解他们的要点。包括XML样式的自动关闭标记,即: 但是你真的不应该在HTML处理中使用正则表达式 答案仅与更正格式错误之前可见的问题上下文相关我想这些跨度是由某个程序生成的,因为

我希望删除此类空白的跨度标签,其中包含以下内容和空间:

我已尝试使用此正则表达式,但它需要调整:

|\s*

preg_替换“|\s*si”,$encoded

你应该了解他们的要点。包括XML样式的自动关闭标记,即:

但是你真的不应该在HTML处理中使用正则表达式

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

你应该了解他们的要点。包括XML样式的自动关闭标记,即:

但是你真的不应该在HTML处理中使用正则表达式


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

我想这些跨度是由某个程序生成的,因为它们似乎没有任何属性。 我不明白为什么你需要把它们之间的空间放在尖括号中,但我也不知道代码的最终目的。 我认为Kent给出了解决方案:您必须使匹配不贪婪:因为您使用dotall选项s,所以您将匹配第一个跨度和最后一个闭合跨度之间的所有内容

所以答案应该是这样的:

preg_替换“|\s*?si”,用$encoded


未测试的

我想这些span是由某个程序生成的,因为它们似乎没有任何属性。 我不明白为什么你需要把它们之间的空间放在尖括号中,但我也不知道代码的最终目的。 我认为Kent给出了解决方案:您必须使匹配不贪婪:因为您使用dotall选项s,所以您将匹配第一个跨度和最后一个闭合跨度之间的所有内容

所以答案应该是这样的:

preg_替换“|\s*?si”,用$encoded


未经测试

将Kent Fredric的regexp翻译为PHP:

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

自动闭合跨距 多行上的跨距以及任何情况 具有属性的跨距 具有不可破空间的跨度 也许你也应该考虑只包括跨度和容器

与往常一样,在调整regexp时,有些工具非常方便:


将Kent Fredric的regexp转换为PHP:

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

自动闭合跨距 多行上的跨距以及任何情况 具有属性的跨距 具有不可破空间的跨度 也许你也应该考虑只包括跨度和容器

与往常一样,在调整regexp时,有些工具非常方便:

我已尝试使用此正则表达式,但它需要调整:

原始问题中的正则表达式以什么方式失败

当跨度变大时,问题就来了 嵌套的,如:

这就是为什么使用正则表达式来解析HTML效果不是特别好的一个例子。根据你的正则表达式风格,这种情况不是不可能在一次通过中处理,就是非常困难。我不知道PHP的ReX引擎能很好地说出它属于哪一类,但是,如果唯一的问题是它取出内层而只剩下外部的,那么你可能会想简单地重新运行你的替代品直到它耗尽了要做的事情。 我已尝试使用此正则表达式,但它需要调整:

原始问题中的正则表达式以什么方式失败

当跨度变大时,问题就来了 嵌套的,如:


这就是为什么使用正则表达式来解析HTML效果不是特别好的一个例子。根据你的正则表达式风格,这种情况不是不可能在一次通过中处理,就是非常困难。我不知道PHP的ReX引擎能很好地说出它属于哪一类,但是,如果唯一的问题是它取出内层并且只剩下外部的,那么你可能会想简单地重新运行你的替代品直到它耗尽了要做的事情。

< P>如果你的唯一问题是嵌套的跨度标签,您可以运行搜索并替换为循环中的正则表达式,直到正则表达式不再找到任何匹配项


这可能不是一个非常优雅的解决方案,但它的性能足够好。

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


这可能不是一个非常优雅的解决方案,但它的性能足够好。

这是我解决嵌套标签问题的方法,虽然还不完整,但很接近

$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语句,该函数工作正常。当你试着写一篇长文章时,问题就来了。如果您有任何帮助,我们将不胜感激。

这是我解决嵌套标签问题的方法,虽然尚未完成,但已接近尾声

$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语句,该函数工作正常。当你试着写一篇长文章时,问题就来了。感谢您的帮助……

稍微修改一下e-satis的答案:

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

这对我很有用。

稍微修改一下e-satis的答案:

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

这对我很管用。

是的,我不能被那些讨厌的引用风格所充斥
ed:/user练习使正则表达式适合他们的语言:我真的厌倦了人们说你不应该在任何类型的XML或HTML上使用正则表达式。有时候用一些像靓汤之类的东西是不合适的。在这种情况下,只要它不在引用区域内出现就可以了。这使得它非常脆弱,我不会使用它,除非是在紧要关头。@nickf:这是为了解决数百万新手的问题,他们使用它作为第一个调用端口,然后XSS利用自己。是的,我不能满足于使用令人讨厌的引用样式:用户练习使正则表达式适合他们的语言:我真的厌倦了人们说你不应该在任何类型的XML或HTML上使用正则表达式。有时候用一些像靓汤之类的东西是不合适的。在这种情况下,只要它不在引用区域内出现就可以了。这使得它非常脆弱,我不会使用它,除非在紧要关头使用。@nickf:it是为了解决数百万新手的问题,他们使用它作为第一个调用端口,然后XSS利用自己。你需要先对span标记的内容进行URL解码,然后你的正则表达式才能处理上面给出的示例。你的正则表达式还可以。只需将替换字符串从更改为。您需要先对span标记的内容进行URL解码,然后您的正则表达式才能处理上面提供的示例。您的正则表达式可以。只需将替换字符串从更改为。是的,我同意,但我想知道是否有一种方法可以递归地重新运行它?否则就很难预测嵌套的标签号/名称……是的,我同意,但我想知道是否有一种方法可以递归地重新运行它?否则,很难预测嵌套的标记编号/名称…OP希望删除空的SPAN元素。OP希望删除空的SPAN元素。