【问题标题】:unicode preg_replace problem in phpphp中的unicode preg_replace问题
【发布时间】:2011-03-09 14:49:11
【问题描述】:

我有字符串

$result = "bei einer Temperatur, die etwa 20 bis 60°C unterhalb des Schmelzpunktes der kristallinen Modifikation"

直接来自 MySQL 表。表格和 php 标头都设置为 UTF-8

我想去掉“度数”符号:http://en.wikipedia.org/wiki/Degree_symbol 并将其替换为“度数”一词以获得:

“bei einer Temperatur, die etwa 20 bis 60degreesC unterhalb des Schmelzpunktes der kristallinen Modifikation”

但我无法让它与 preg_replace 一起使用。

如果我这样做:

$result = preg_replace('/\xB0/u'," degrees ", $result ); - I get an empty string

如果我这样做::

$result = preg_replace('/\u00B0/u'," degrees ", $result ); - I get the error:

警告:preg_replace() [function.preg-replace]:编译失败:PCRE 不支持 /var/www/html/includes 中偏移量 1 处的 \L、\l、\N、\U 或 \u /classes/redeyeTable.inc.php 第 75 行

我不擅长编码...我在这里做错了什么?

【问题讨论】:

  • 您发布的第一个解决方案非常适合我。
  • 根据此页面(以及您的错误消息顺便说一句),您不能使用 \u fr.php.net/manual/en/reference.pcre.pattern.differences.php
  • 你确定你有相同的符号吗? Unicode 有很多相似的字符。
  • 第一个应该可以正常工作。但如果你只是替换它,你可以使用更快的 str_replace() 来代替。
  • 感谢 cmets - 我同意第一个选项应该有效。我不知道为什么它会删除所有文本。我发现 PHP 和 UTF-8 是一个相当棘手的组合。我只是使用标准的 ubuntu 10.04 安装和最新的稳定 PHP 构建,不知道为什么字符处理每次都失败。

标签: php regex unicode utf-8 preg-replace


【解决方案1】:

使用

$result = preg_replace('/\x{00B0}/u'," degrees ", $result );

有关\x{FFFF}-语法的更多信息,请参阅here

注意\xB0\x{00B0}之间的区别很重要:

  • \xB0 表示带有十六进制代码B0(十进制176)的单个字符,例如 ISO-8859-1 中的度数符号(°
  • \x{00B0} 表示 unicode 代码点 U+00B0,它描述了 unicode 系统中的度数符号 (°)。使用 UTF-8 编码时,此代码点将使用两个字节 \xC2\xB0 进行编码。

【讨论】:

  • 行得通!感谢 Stefan 和所有做出贡献的人。我的错误是没有在 unicode 代码点周围使用 { }。我很欣赏 \xB0 和 \x{00B0} 之间的区别 - 这是更绝望的试验和错误让我解决了 \xB0 替换 unicode 字符串。 Stackoverflow 再次成为救命稻草!
  • @Ed:您可以将答案标记为“已接受”,以向其他用户表明这是您问题的解决方案。
  • 我不知道我花了多少小时来寻找为什么我的正则表达式替换一些 UTF8 字符不起作用,并且感谢 \xNN 与 \x{NN} 的这个技巧,我终于得到了对的。非常感谢 Stefan :-)
【解决方案2】:

如果使用 'u' 修饰符,模式应该被视为 utf-8,那么为什么不简单地写 '°' 而不是 '\u00B0' 或 '\xB0'?

【讨论】:

  • $result = preg_replace('/°/u',"degrees", $result);确实有效....为什么在十六进制中给出字符串不起作用?
猜你喜欢
  • 1970-01-01
  • 2011-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-30
  • 1970-01-01
相关资源
最近更新 更多