您可以通过get_html_translation_table函数获取htmlentities使用的对应字符=>实体列表;考虑这段代码:
$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,我想——我正在尝试找到解决方案,并将再次编辑) p>
几分钟后的第二次编辑:看来您必须在$search 列表中使用utf8_encode,然后再调用str_replace :-(
这意味着使用这样的东西:
$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)
这次应该可以了^^
它并不真正适合一行,可能不是最优化的解决方案;但它应该可以正常工作,并且具有允许您添加/删除任何对应字符 => 您需要或不需要的实体的优点。
玩得开心!