preg_replace UTF-8 不工作
preg_replace UTF-8 doesn't work
我有以下代码,在我的离线测试版本上运行良好,但在在线服务器上却失败了。
$names = "dimitris giannIs micHalis";
echo preg_replace("/s\b/", "w", mb_convert_case($names, MB_CASE_TITLE, "UTF-8"));
我得到的结果是Dimitriw Gianniw Michaliw
。
但是我得到的不是英语 chars/words,而是 UTF-8。如果我按原样放置上面的示例(英文)它工作正常所以我猜我在这里用 UTF-8
做错了什么
通常(但请参阅 Edit 下面的注释),您需要在正则表达式上使用 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 字符。这或许可以解释离线测试版本和在线服务器上的结果之间的差异。
我有以下代码,在我的离线测试版本上运行良好,但在在线服务器上却失败了。
$names = "dimitris giannIs micHalis";
echo preg_replace("/s\b/", "w", mb_convert_case($names, MB_CASE_TITLE, "UTF-8"));
我得到的结果是Dimitriw Gianniw Michaliw
。
但是我得到的不是英语 chars/words,而是 UTF-8。如果我按原样放置上面的示例(英文)它工作正常所以我猜我在这里用 UTF-8
做错了什么 通常(但请参阅 Edit 下面的注释),您需要在正则表达式上使用 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 字符。这或许可以解释离线测试版本和在线服务器上的结果之间的差异。