这是我的PHP函数,用于从字符串输入中删除所有空的HTML标签:
/**
* Remove the nested HTML empty tags from the string.
*
* @param $string String to remove tags
* @param null $replaceTo Replace empty string with
* @return mixed Cleaned string
*/
function crl_remove_empty_tags($string, $replaceTo = null)
{
// Return if string not given or empty
if (!is_string($string) || trim($string) == '') return $string;
// Recursive empty HTML tags
return preg_replace(
'/<(\w+)\b(?:\s+[\w\-.:]+(?:\s*=\s*(?:"[^"]*"|"[^"]*"|[\w\-.:]+))?)*\s*/?>\s*</\1\s*>/gixsm',
!is_string($replaceTo) ? '' : $replaceTo,
$string
);
}
我的正则表达式:/<(\w+)\b(?:\s+[\w\-.:]+(?:\s*=\s*(?:"[^"]*"|"[^"]*"|[\w\-.:]+))?)*\s*/?>\s*</\1\s*>/gixsm
我用http://gskinner.com/RegExr/和http://regexpal.com/测试了它,它工作得很好。但当我试着运行它。服务器总是返回错误:
Warning: preg_replace(): Unknown modifier '\'
我不知道到底哪里出了问题。谁来帮帮我!
7条答案
按热度按时间r6vfmomb1#
在php正则表达式中,如果定界符出现在表达式中,则需要对其进行转义。
在本例中,有两个未转义的
/
;只需将它们替换为\/
即可。您也不需要修饰符数组-- php默认是全局的,并且您没有定义文字字符。之前:
之后:
nqwrtyyt2#
该模式能够移除“空标签”(即不包含任何内容、空格、HTML注解或其他“空标签”的非自关闭标签),即使这些标签像
<span><span></span></span>
一样嵌套。HTML评论中的标签不被考虑:局限性:
<script src="myscript.js"></script>
var myvar="<span></span>";
或类似:
var myvar1="<span><!--"; function doSomething() { alert("!!!"); } var myvar2="--></span>";
找到了
这些限制是由于基本的文本方法无法区分html和JavaScript代码。然而,如果你在模式跳过列表中添加“脚本”标签(与html注解相同),就有可能解决这个问题,但在这种情况下,你需要基本上描述JavaScript内容(字符串,注解,文字模式,所有不是前三个),这不是一个微不足道的任务,但可能的。
1l5u6lss3#
删除空元素...和下一个空元素。
体育
结果如下:
PHP代码:
s8vozzvw4#
我不确定这是否是你需要的,但我今天找到了这个。你需要PHP 5.4 +!
也许这对你有用。
emeijp435#
你也可以使用递归来解决这个问题。继续将HTML blob传递回函数,直到空标记不再存在。
这将检查空HTML标记的存在并替换它们,直到正则表达式模式不再匹配。
8ftvxx2r6#
下面是删除所有空标记的另一种方法。(它还删除周围的标签,如果它们由于空的子级而被条件为空:
我一直在用这个来清理外部CMS的HTML,结果是积极的。
zzlelutf7#