2011-02-01 57 views
0

我有一段文字(部分法文部分英文),其中有多次欧洲风格的加拿大元符号($C)。当我尝试使用传统或unicode字符使用正则表达式时,符号已从文本中删除,无法与之匹配。我使用了一个懒惰的正则表达式,所以如果它没有找到预期的符号,它仍然有效。PCRE似乎是删除特定字符

此外,文本是在一个XML的UTF-8文档,并从Web界面(室内制作)显示。

+3

为什么不显示您尝试的代码,以及一些示例文本? – ircmaxell 2011-02-01 19:37:11

+0

确定文本:门票总价:256,00 $ C税费:221,42美元C总计:477,42美元渥太华(麦克唐纳 - 卡地亚国际机场)至多伦多(YYZ)2011年8月8日1:30 PM - 2:32 PM – 2011-02-01 20:06:37

+0

正则表达式:<?php $ cost = REGEX('$ MONETARY $'); $ pattern ='/ total:((\ D | \ P {N})+?\ s?)?(?:'。$ cost。')\ s?([$ C])?/'; $ match = GetMatch($ pattern,$ input,0,1); if(isEmpty($ match)){$ match = GetMatch($ pattern,$ input,0,0); } return $ match;?> – 2011-02-01 20:07:35

回答

0

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

如果你不想这样做,你可以使用像这样的结构将字符串(正则表达式)中的代码点嵌入(在Perl中)$ regex = /这是一些文本,这是:\ x {1209} a码点unicode字符/;

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

编辑 - 我不认为这是对加拿大元unicode的,而“$ C”,就像有人说你要逃避$如果正则表达式进行插值。 如果你保留$ C,字符类[$ C]匹配$或C,而不是组合。也许(?:\ $ | \ $ C)会是一个更好的锚点。

0

将RegExp中的$转义出来,美元符号在RegExp中有特殊含义。

0

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