【问题标题】:PCRE seems to be removing particular charactersPCRE 似乎正在删除特定字符
【发布时间】:2011-02-01 19:34:50
【问题描述】:

我有一段文本(部分是法语部分是英语),其中多次包含欧洲风格的加元符号 ($C)。当我尝试使用传统或 unicode 字符的正则表达式时,符号已从文本中删除并且无法匹配。我使用了一个惰性正则表达式,因此如果它没有找到预期的符号,它仍然可以工作。

此外,文本位于 xml utf-8 文档中,并从 Web 界面(内部制作)显示。

【问题讨论】:

  • 为什么不显示您尝试过的代码和一些示例文本?
  • 确定文本: 总票价:256,00 $C 税费:221,42 $C 机票总价:477,42 $C 渥太华(麦克唐纳-卡地亚国际机场)到多伦多(YYZ) 2011 年 3 月 8 日下午 1:30 - 下午 2:32
  • 正则表达式:
  • 小改动:$pattern = '/总计:((\D|\P{N})+?\s?)?(?:'.$cost.')\s?( (\D|\P{N})+?\s?)?/';

标签: php regex utf-8


【解决方案1】:

转义正则表达式中的 $,美元符号在正则表达式中具有特殊含义。

【讨论】:

    【解决方案2】:

    在 perl 中,正则表达式和代码以 ascii 显示,但如果你想在文本中嵌入 unicode,首先你必须有一个可以处理 unicode 的编辑器,其次你必须告诉 Perl 你的源代码包含 unicode(带有use utf8'pragma)。

    如果您不想这样做,您可以在字符串(正则表达式)中嵌入(在 Perl 中)代码点,使用类似这样的结构 $regex = /this is some text, this: is \x{1209} a codepoint unicode 字符/;

    如果数据源被解码为 Unicode(内部化)并包含该字符,则它匹配该字符。

    编辑 - 我认为加拿大元没有 unicode,而是 '$C',就像有人说如果插入正则表达式,你必须转义 $。 如果保留 $C,则字符类 [$C] 匹配 $ 或 C,而不是组合。也许 (?:\$|\$C) 会是一个更好的锚。

    【讨论】:

    • 我最终将不得不解码多个符号,因此在这里使用特定的字符代码无效。
    • 我认为utf-8可能没有启用。有谁知道如何检查 pcre 并且如果没有启用很容易启用它(无需重建)?
    • 我把模式的结尾改成了(\$)?一个人,它仍然找不到它,所以我很确定它是 unicode。
    • @Chris,如果你的字符串是单引号,'\$' 将尝试匹配文字 \ 然后 $,在这种情况下,'$' 就是你想要的。尝试单独的 '/(.*?)$/' 或 '/$/' 只是为了匹配。或者您可以尝试“/\$/”甚至“/\x{0024}/”。
    • 谢谢 在进入数据库的问题中不能使用引号。它基本上归结为这两个字符被视为“”。
    【解决方案3】:

    这个问题原来是我调用 eval() 之前代码中的一个错误。法语 unicode 中的某些东西与传递给 eval 的代码搞砸了,所以通过不将文本和正则表达式结合起来,它工作得很好。

    【讨论】:

      猜你喜欢
      • 2012-02-22
      • 1970-01-01
      • 2014-11-07
      • 2015-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-16
      • 1970-01-01
      相关资源
      最近更新 更多