我想将字符串中的所有文本转换为 html 实体,但保留 HTML 标签,例如:
<p><font style="color:#FF0000">Camión español</font></p>
应该翻译成这样:
<p><font style="color:#FF0000">Camión español</font></p>
有什么想法吗?
最佳答案
您可以获得htmlentities
使用的对应字符=>实体的列表, 函数 get_html_translation_table
;考虑这段代码:
$list = get_html_translation_table(HTML_ENTITIES);
var_dump($list);
(您可能需要在手册中检查该函数的第二个参数——也许您需要将其设置为不同于默认值的值)
它会给你这样的东西:
array
' ' => string ' ' (length=6)
'¡' => string '¡' (length=7)
'¢' => string '¢' (length=6)
'£' => string '£' (length=7)
'¤' => string '¤' (length=8)
....
....
....
'ÿ' => string 'ÿ' (length=6)
'"' => string '"' (length=6)
'<' => string '<' (length=4)
'>' => string '>' (length=4)
'&' => string '&' (length=5)
现在,删除你不想要的对应:
unset($list['"']);
unset($list['<']);
unset($list['>']);
unset($list['&']);
现在,您的列表包含 htmlentites 使用的所有对应字符 => 实体,除了您不想编码的少数字符。
现在,您只需提取键和值列表:
$search = array_keys($list);
$values = array_values($list);
最后,您可以使用 str_replace 进行替换:
$str_in = '<p><font style="color:#FF0000">Camión español</font></p>';
$str_out = str_replace($search, $values, $str_in);
var_dump($str_out);
你会得到:
string '<p><font style="color:#FF0000">Camión español</font></p>' (length=84)
这看起来像你想要的 ;-)
编辑:好吧,除了编码问题(该死的 UTF-8,我想——我正在努力寻找解决方案,并将再次编辑)
几分钟后的第二次编辑:在调用 str_replace
之前,您似乎必须在 $search
列表中使用 utf8_encode
: -(
这意味着使用这样的东西:
$search = array_map('utf8_encode', $search);
在对 array_keys
的调用和对 str_replace
的调用之间。
而且,这一次,你真的应该得到你想要的:
string '<p><font style="color:#FF0000">Camión español</font></p>' (length=70)
这是代码的完整部分:
$list = get_html_translation_table(HTML_ENTITIES);
unset($list['"']);
unset($list['<']);
unset($list['>']);
unset($list['&']);
$search = array_keys($list);
$values = array_values($list);
$search = array_map('utf8_encode', $search);
$str_in = '<p><font style="color:#FF0000">Camión español</font></p>';
$str_out = str_replace($search, $values, $str_in);
var_dump($str_in, $str_out);
以及完整的输出:
string '<p><font style="color:#FF0000">Camión español</font></p>' (length=58)
string '<p><font style="color:#FF0000">Camión español</font></p>' (length=70)
这次应该可以了^^
它并不真正适合一行,可能不是最优化的解决方案;但它应该可以正常工作,并且具有允许您添加/删除任何对应字符 => 您需要或不需要的实体的优点。
玩得开心!
关于php - PHP中的htmlentities但保留html标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1364933/