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*&lt;[\/\s]*(br|hr|/p|/div)[\/\s]*&gt;\s*#iu', '#\s+#' ), 
  ' ', 
  $output );
echo $output;