【问题标题】:PHP convert characters applicable for title tagPHP转换适用于标题标签的字符
【发布时间】:2014-03-10 14:36:22
【问题描述】:

在我的页面中,我将小写字符串转换为大写字符串并在标题标签中输出它们。首先我遇到了  不被接受的问题,所以我必须保留实体。

所以我将它们转换为 unicode,然后是大写,然后再转换回 htmlentities

echo htmlentities(strtoupper(html_entity_decode(ob_get_clean())));

现在我遇到了与“正确的单引号”相关的问题。我在标题中将这个角色命名为’

似乎我正在使用的两个函数中的任何一个都不能正确转换它们。有没有更好的功能可以使用,或者有什么特别适合标题标签的功能?

编辑:这是我没有影响的原始数据的 var_dump:

string(74) "Example example example » John Doe- Who’s That? "

编辑二:这是我上面的代码的结果:

如果我只使用strtoupper,就会发生这种情况:

【问题讨论】:

  • 为什么你的 data 中有 HTML 实体?
  • 如果那真的是 html 并且你在 html 上下文中使用它,为什么不直接使用 css 呢? text-transform: uppercase 将处理显示问题,并为您保留原始文本。
  • @MarcB:请仔细阅读问题。就像标题告诉你的那样,它是关于标题标签 (<title></title>)。 CSS 不适用于浏览器窗口标题。 @CBroe:不幸的是,我对内容没有任何影响。它来自一个不同的网络服务,它给了我这个字符串,因为它是
  • 你为什么要做这一切? strtoupper 也适用于原始数据。 html 不关心 entities 大小写,因此   将被视为与   相同的方式。
  • 我唯一会做的事(如果标题是用户输入)是在输入上运行 htmlspecialchars 以对其进行清理。

标签: php html title html-entities entities


【解决方案1】:

您的问题是 strtoupper 会破坏您的 UTF-8 实体解码输入,因为它不支持多字节。在这种情况下,’ 解码为十六进制编码的 UTF-8 序列e2 80 99。但是在strtoupper 的单字节世界中,代码为\xe2 的字符是â,它被转换为Â (\xc2)——这会使您的文本成为无效的UTF-8 序列。

只需改用mb_strtoupper

【讨论】:

  • 我们的客户运行的服务器没有安装mbstring,很遗憾我无法管理它:(我已经有了几个需要mb的想法
  • @Julian:那么您将不得不接受没有办法将非 ASCII 字符大写。对于 ASCII 字符,使用 strtr 到大写 a-z,这是 UTF-8 安全的。
  • 那么告诉他们要么升级他们的服务器(我认为已经达到了事实上的标准),要么让他们为你的自定义实现的开发付费– 或者告诉他们过去的没有武器,没有饼干的故事……
  • 我在本地 PHP 活动 shell 中尝试了您的想法。但是当我改用mb_strupper 时,htmlentities 不会返回任何内容。是否还有 MB 等价的?
  • 可以试试61924.nl/php-utf8/documentation/core/…,但我不完全确定这是你的问题
【解决方案2】:

这很难看,但它可能对你有用(尽管我肯定会建议 Jon 的解决方案):

在你的strtoupper()之后,你可以用这种方式替换所有大写的HTMLentities:

$entity_table = get_html_translation_table(HTML_ENTITIES);
$entity_table_uc = array_map('strtoupper', $entity_table);
$string = str_replace($entity_table_uc, $entity_table, $string);

这应该消除对htmlentities() / html_entity_decode() 的需要。

【讨论】:

    猜你喜欢
    • 2013-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多