【问题标题】:preg_replace UTF-8 doesn't work [duplicate]preg_replace UTF-8 不起作用[重复]
【发布时间】:2019-01-30 09:01:33
【问题描述】:

我的以下代码在我的离线测试版本上运行良好,但在在线服务器上失败。

$names = "dimitris giannIs micHalis";
echo preg_replace("/s\b/", "w", mb_convert_case($names, MB_CASE_TITLE, "UTF-8"));

我得到的结果是Dimitriw Gianniw Michaliw

但不是英文字符/单词,我有 UTF-8 字符。如果我按原样(英文)放置上面的示例,它可以正常工作,所以我猜我在这里用 UTF-8 做错了

【问题讨论】:

  • 运行 phpinfo() 并检查 mbstring 扩展名
  • @IdontDownVote 它看起来与离线版本相似。我应该给你看一些具体的东西吗?
  • 我不做很多多字节刺痛操作我只知道扩展可能并不总是安装。因为它适用于您的一种设置,但不是另一种设置,因此可以肯定它是 php 安装本身的问题。希望您已经通过这些链接:php.net/manual/en/mbstring.setup.php

标签: php regex encoding preg-replace


【解决方案1】:

通常(但请参阅 编辑 下方的注释),您需要在正则表达式上使用 u 修饰符以使其与 UTF-8 字符一起使用。例如

$words = "qθαεqθε γραεcισ cονσεcτε";
echo preg_replace("/ε\b/u", "α", mb_convert_case($words, MB_CASE_TITLE, "UTF-8"));

输出:

Qθαεqθα Γραεcισ Cονσεcτα

rextester 上的这个example 演示了u 修饰符的使用(请注意,rextester 不支持mb_convert_case,但这并不真正影响结果)。

编辑

正如@CasimiretHippolyte 所指出的,默认情况下,可以使用--enable-unicode-properties 选项编译PCRE 扩展(PHP 用于正则表达式)来处理Unicode 字符。这或许可以解释离线测试版和在线服务器上结果的差异。

【讨论】:

  • 不是说你错了,但 OP 说它适用于他的离线版本。
  • @Nick:即使您的答案有用并解决了问题,您的评论也是错误的,因为 pcre 扩展(由 php 用于正则表达式)可以编译为默认处理 unicode 字符 (带有--enable-unicode-properties 选项)并将\b 扩展到Unicode 字符,而无需在模式的开头添加u 修饰符或(*UCP)。这可能是它适用于在线测试而不适用于服务器的原因。
  • @CasimiretHippolyte 我不知道。谢谢你启发我。我将删除评论并为帖子添加编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-15
  • 2013-01-29
  • 2013-07-19
  • 2019-03-08
相关资源
最近更新 更多