php - PHP中的htmlentities但保留html标签

标签 php html string replace html-entities

我想将字符串中的所有文本转换为 html 实体,但保留 HTML 标签,例如:

<p><font style="color:#FF0000">Camión español</font></p>

应该翻译成这样:

<p><font style="color:#FF0000">Cami&oacute;n espa&ntilde;ol</font></p>

有什么想法吗?

最佳答案

您可以获得htmlentities使用的对应字符=>实体的列表, 函数 get_html_translation_table ;考虑这段代码:

$list = get_html_translation_table(HTML_ENTITIES);
var_dump($list);

(您可能需要在手册中检查该函数的第二个参数——也许您需要将其设置为不同于默认值的值)

它会给你这样的东西:

array
  ' ' => string '&nbsp;' (length=6)
  '¡' => string '&iexcl;' (length=7)
  '¢' => string '&cent;' (length=6)
  '£' => string '&pound;' (length=7)
  '¤' => string '&curren;' (length=8)
  ....
  ....
  ....
  'ÿ' => string '&yuml;' (length=6)
  '"' => string '&quot;' (length=6)
  '<' => string '&lt;' (length=4)
  '>' => string '&gt;' (length=4)
  '&' => string '&amp;' (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&Atilde;&sup3;n espa&Atilde;&plusmn;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&oacute;n espa&ntilde;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&oacute;n espa&ntilde;ol</font></p>' (length=70)

这次应该可以了^^
它并不真正适合一行,可能不是最优化的解决方案;但它应该可以正常工作,并且具有允许您添加/删除任何对应字符 => 您需要或不需要的实体的优点。

玩得开心!

关于php - PHP中的htmlentities但保留html标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1364933/

相关文章:

python - 在 python 中重新格式化字符串

html - 如何在 cfoutput 中添加#?

php - 我正在尝试在 CloudControl 上使用 CodeIgniter 和 RestServer 实现 REST-API

php - "Build"JS变量

javascript - 全局互动时尚时尚 map 用JavaScript不可能实现吗?

html - 在全宽 css 菜单下拉菜单中获取下拉菜单链接以与其父元素对齐

php - 如何在网页中使用session?

php - 使用 gettext 在 ajax 调用中翻译电子邮件

javascript - 如何在html中更改文本框的输入语言?

c# - DateTime.ParseExact 返回 FormatException