【问题标题】:preg_replace - NULL result?preg_replace - NULL 结果?
【发布时间】:2009-09-16 20:09:51
【问题描述】:

这是一个小例子(下载,重命名为 .php 并在你的 shell 中执行):

test.txt

为什么preg_replace返回NULL而不是原始字符串?

\x{2192} 等同于 HTML“→”(“→”)。

【问题讨论】:

  • 请把相关代码贴在这里。
  • 复制粘贴不会返回NULL。该问题似乎与字符串中的特殊字符有关。如果我发布代码,它们将不会被保留。

标签: php pcre


【解决方案1】:

当我的正则表达式包含 u UTF-8 PCRE modifier 时,我得到了一个空响应。如果您的源文本是 not UTF 并且您有此修饰符,您将得到一个空结果。

【讨论】:

  • 反之亦然 - 如果你有一个 UTF 字符串,如果你包含u修饰符,你将得到一个空结果。
【解决方案2】:

来自preg_replace()上的文档:

返回值

preg_replace() 返回一个数组,如果 主题参数是一个数组,或者一个 否则为字符串。

如果找到匹配项,则新主题 将被退回,否则以 将原封不动地返回或 NULL 如果 发生错误。

在您的模式中,我认为不支持 u 标志。 错误

编辑:主题似乎存在某种编码问题。当我删除“147 3.2 V6 - GTA (184 kW)”并手动重新输入时,一切似乎都正常了。

编辑 2:在您提供的模式中,有 3 个空格似乎给正则表达式引擎带来了问题。当我将它们转换为十进制时,它们的值为 160(而不是普通空间 32)。当我用普通空间替换这些空间时,它似乎可以工作。

我用下面的下划线替换了有问题的空格:

'147 3.2 V6 - GTA (184 kW)' '147 3.2_V6 - GTA_(184_kW)'

【讨论】:

  • "在您的模式中,我认为不支持 u 标志。"请详细说明。不支持你怎么办? u 只是表示模式应被视为 UTF-8 字符串。
  • 是的,PHP 似乎在读取字符串时出现问题。它是使用 PEAR 库从 Excel 文件中读取的...
【解决方案3】:
  • 您正在使用单引号,这意味着您唯一可以转义的是其他单引号。启用转义序列(例如\x32,然后使用双引号“”)
  • 我不是 UTF8 专家,但转义码 \x2192 也不正确。您可以这样做:\x21\x92 将两个字节都放入您的字符串中,但您可能需要查看 utf8_encodeutf8_decode
  • 您的源字符串中包含无效字符或其他内容。 PHP 给出: 警告:preg_replace():编译失败:第 7 行 test.php 中偏移量 0 处的无效 UTF-8 字符串

【讨论】:

  • 你的第一点是错误的 - 引用样式在这里无效。试试这个:“echo preg_replace('~\x{20AC}~u', 'EUR', '€1000');”。您将用 EUR 代替欧元符号。你的第二点也是错误的。来自 php 文档:“在 UTF-8 模式下,允许使用“\x{...}”,其中大括号的内容是一串十六进制数字。它被解释为 UTF-8 字符,其代码编号是给定十六进制数。”。你的第三点 - 我没有在我的机器上收到这个警告,但是,在 PHP 的视图中,字符串似乎格式不正确。该字符串是使用一些库从 Excel 文件中读取的...
【解决方案4】:

我相信你的正则表达式也有问题:~\x{2192}~u

尝试替换我所拥有的,看看是否适合您:/\x{2192}/u

【讨论】:

  • 虽然表达式没问题,但 \x{2192} 在 PHP 中是没有意义的,它只接受 0-255 的十六进制代码
  • @razzed:你错了。请阅读我的评论以获得您的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-20
  • 2017-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-21
  • 2020-04-23
相关资源
最近更新 更多