在PHP中剥离所有空HTML标记对
我正在寻找一种从字符串中去除所有空HTML标记对的方法,例如在PHP中剥离所有空HTML标记对,php,html,regex,Php,Html,Regex,我正在寻找一种从字符串中去除所有空HTML标记对的方法,例如和。虽然找到一个用于此目的的正则表达式相对容易,但我找不到一个能够可靠地与PHP的preg_replace()一起工作的正则表达式。以下是我尝试过的函数之一(摘自): 功能条\u空\u标签($text){ //匹配空元素(属性值可能有尖括号)。 $re='% #正则表达式以匹配空的HTML4.01过渡元素。 (?>[\p{Z}\p{C}]*>|&((?:nb | thin | zwnb | e[nm])sp | zwnj | xfeff
和
。虽然找到一个用于此目的的正则表达式相对容易,但我找不到一个能够可靠地与PHP的preg_replace()
一起工作的正则表达式。以下是我尝试过的函数之一(摘自):
功能条\u空\u标签($text){
//匹配空元素(属性值可能有尖括号)。
$re='%
#正则表达式以匹配空的HTML4.01过渡元素。
<#Opening tag Opening“需要一个,因为示例“empty”标记实际上是:
还将标记与空间图元匹配的步骤
$re = '~<(\w+)[^>]*>(?>[\p{Z}\p{C}]|<br\b[^>]*>|&(?:(?:nb|thin|zwnb|e[nm])sp|zwnj|#xfeff|#xa0|#160|#65279);)*</\1>~iu'
$re='~*>(?>[\p{Z}\p{C}]*>&((?:nb | thin | zwnb | e[nm])sp | zwnj | xfeff | xa0 | 160 | | 65279)*~iu
;根据您的需要进行修改
使用(无while循环)
$re='~*>(?>[\p{Z}\p{C}]*>|&((?:nb | thin | zwnb | e[nm])sp | zwnj | xfeff | xa0 | 160 | | 65279 |(?R))*~iu;
继我对Jonny 5的回答的评论之后,我在递归正则表达式中添加了几个可接受的标记,因为iframe
和canvas
通常可以为空
$re = '~<((?!iframe|canvas)\w+)[^>]*>(?>[\p{Z}\p{C}]|<br\b[^>]*>|&(?:(?:nb|thin|zwnb|e[nm])sp|zwnj|#xfeff|#xa0|#160|#65279);|(?R))*</\1>~iu';
$re='~*>(?>[\p{Z}\p{C}]*>|&((?:nb | thin | zwnb | e[nm])sp | zwnj | xfeff | xa0 | 160 | | 65279 |(?R))*~iu;
特定的regex不寻找自动关闭标记。您可能希望添加一个替代的\s*
。(如果您没有使用regex,您可以研究XPath。)只有两个wmpty标记,对吗?您问题中的HTML示例文本标记没有可剥离的空元素(除了自动关闭的
标记之外)。两个
标记中的每一个看起来是空的,实际上包含两个“``”非空白unicode字符-(\uFEFF
)。在我看来似乎是网页字符编码问题。@ridgerunner哇。你是如何检测到的?@Artem Gordinsky-复制并粘贴到文本编辑器中。(注意,作为上述正则表达式/函数的作者,我非常有兴趣回答人们可能遇到的任何问题。)那些正则表达式完全令人难以置信;但效果很好!有没有办法允许特定的空标记,例如通常为空的“iframe”或“canvas”?
$re = '~<(\w+)[^>]*>[\p{Z}\p{C}]*</\1>~u';
$re = '~<(\w+)[^>]*>(?>[\p{Z}\p{C}]|<br\b[^>]*>)*</\1>~ui';
$re = '~<(\w+)[^>]*>(?>[\p{Z}\p{C}]|<br\b[^>]*>|&(?:(?:nb|thin|zwnb|e[nm])sp|zwnj|#xfeff|#xa0|#160|#65279);)*</\1>~iu'
$re = '~<(\w+)[^>]*>(?>[\p{Z}\p{C}]|<br\b[^>]*>|&(?:(?:nb|thin|zwnb|e[nm])sp|zwnj|#xfeff|#xa0|#160|#65279);|(?R))*</\1>~iu';
$re = '~<((?!iframe|canvas)\w+)[^>]*>(?>[\p{Z}\p{C}]|<br\b[^>]*>|&(?:(?:nb|thin|zwnb|e[nm])sp|zwnj|#xfeff|#xa0|#160|#65279);|(?R))*</\1>~iu';