Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中剥离所有空HTML标记对_Php_Html_Regex - Fatal编程技术网

在PHP中剥离所有空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

我正在寻找一种从字符串中去除所有空HTML标记对的方法,例如

。虽然找到一个用于此目的的正则表达式相对容易,但我找不到一个能够可靠地与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';