PHP:preg#u replace donds';无法处理htmlentities()结果 $output=htmlentities(“示例示例”); echo$输出; $output=preg_replace( 数组('#[\s\n\\n]*[\s\n\\n]*#iu','#\s+#'), ' ', 美元产出); echo$输出;
上面的代码将打印PHP:preg#u replace donds';无法处理htmlentities()结果 $output=htmlentities(“示例示例”); echo$输出; $output=preg_replace( 数组('#[\s\n\\n]*[\s\n\\n]*#iu','#\s+#'), ' ', 美元产出); echo$输出;,php,regex,preg-replace,special-characters,html-entities,Php,Regex,Preg Replace,Special Characters,Html Entities,上面的代码将打印示例示例>,而不是示例。两个echo打印相同的字符串,示例示例>。但是我需要继续使用htmlentities(),因为如果我不使用它,preg\u replace将破坏一些特殊字符,如a。我在这个问题中提到过: 有人知道有什么解决办法吗?谢谢。htmlentities将getElementsByTagName($tag))作为$node){ $node->parentNode->removeChild($node); }; } } 函数getHtmlText($html){
示例
示例>
,而不是示例
。两个echo
打印相同的字符串,示例
示例>
。但是我需要继续使用htmlentities()
,因为如果我不使用它,preg\u replace将破坏一些特殊字符,如a
。我在这个问题中提到过:
有人知道有什么解决办法吗?谢谢。htmlentities将
替换为
和
,因此您需要在regexp中搜索替换项
$output = htmlentities("example<br><br>example");
echo $output;
$output = preg_replace(
array( '#[\s\n\\n]*<[\/\s]*(br|hr|/p|/div)[\/\s]*>[\s\n\\n]*#iu', '#\s+#' ),
' ',
$output );
echo $output;
如果我理解正确,您需要一个
strip_tags
变体,它将在相邻的文本节点之间留出一个空间,以避免单词粘在一起
一种方法是使用DOMDocument
类。您可能还希望删除不可打印的内容,例如script
标记的内容:
函数DOMRemoveTags($dom,$tags){
foreach($tags作为$tag){
foreach(迭代器到数组($dom->getElementsByTagName($tag))作为$node){
$node->parentNode->removeChild($node);
};
}
}
函数getHtmlText($html){
$dom=新的DOMDocument();
$dom->loadHTML($html);
//删除一些标记及其内容
DOMRemoveTags($dom,['script','textarea','iframe']);//根据需要扩展
$xpath=newdomxpath($dom);
//获取所有文本节点并使用空格分隔符将它们连接起来
返回内爆(“”,数组映射(函数($node){
返回修剪($node->nodeValue);
},迭代器_to_数组($xpath->query('//text()'));
}
$html=“示例
fdsfsd222example”;
echo htmlentities(getHtmlText($html));
通过使用这个domapi,您可以避免正则表达式解决方案存在的一些潜在问题:如果一个HTML字符串具有
,您想从PHP字符串中删除HTML标记吗?不。我想用标签数组替换Sytha StRead替换的一些标签是不够的?你不能先用空格替换标签吗?不用说某人是哑巴(我没有说),你应该考虑你或你的老板会犯错误(这不是一个羞耻,在学习过程中是正常的事情),或者是随机的事情,或者是一种神奇的东西,让开发者在死后到达天堂。
$output = preg_replace(
array( '#\s*<[\/\s]*(br|hr|/p|/div)[\/\s]*>\s*#iu', '#\s+#' ),
' ',
$output );
echo $output;