2013-07-18 135 views
1

很长一段时间,任何时候我需要使用正则表达式,我已经使用版权符号©作为分隔符来标准化,因为它是一个符号,它不在键盘上,我肯定不会在正则表达式中使用,不像! @#\或/(它们有时在正则表达式中全部使用)。PHP正则表达式分隔符

代码:

$result=preg_match('©<.*?>©', '<something string>'); 

不过,今天我需要使用重音字符,其中包括这个正则表达式:

代码:

[a-zA-ZàáâäãåąćęèéêëìíîïłńòóôöõøùúûüÿýżźñçčšžÀÁÂÄÃÅĄĆĘÈÉÊËÌÍÎÏŁŃÒÓÔÖÕØÙÚÛÜŸÝŻŹÑßÇŒÆČŠŽ∂ð \,\.\'-]+ 

包括在这个新的正则表达式之后PHP文件在我的IDE(Eclipse PDT)中,我被提示将PHP文件保存为UTF-8而不是默认的cp1252。

保存并运行PHP文件后,每当我在preg_match()或preg_replace()函数调用中使用正则表达式时,它都会生成一个通用PHP警告(Warning:preg_match,位于第x行的file.php中)和正则表达式没有被处理。

所以 - 两个问题:

1)是否有另一种符号,这将是好是不典型的键盘(`[email protected]#$%^&*()+=[]{};\':",./<>?|\),我可以在标准化,而不用担心上发现了一个分隔符使用必须检查每一个正则表达式,看看这个符号是否真的在表达式的某个地方被使用了?

2)或者,当文件格式为UTF-8时,我可以使用版权符号作为标准分隔符吗?

+1

顺便说一句评语:你可以写相同的字符类是这样的:'[A-ZA-ZA-OO ''''''''''''''''''''''。看看这个链接:http://en.wikibooks.org/wiki/Unicode/Character_reference/0000-0FFF –

+0

这当然要紧凑得多。谢谢! :) –

回答

4

需要纠正的一件事是,如果您的正则表达式和/或输入数据使用UTF-8编码(在本例中为UTF-8编码文件,因为它直接来自UTF-8编码文件),您必须使用正则表达式的u修饰符。

另一个问题是,版权字符不应该用作UTF-8中的分隔符,因为PCRE函数认为the first byte of your pattern encodes your delimiter(这在PHP中可能被称为bug)。

当您尝试使用copyright sign作为UTF-8中的分隔符时,实际保存到文件中的是字节序列0xC20xA9preg_match查看第一个字节0xC2并确定它是字母数字字符,因为在您当前的语言环境中,该字节对应于字符拉丁文大写字母A,带有调制轮廓Â(请参见extended ASCII table)。因此会产生警告,并立即中止处理。

鉴于这些事实,理想的解决方案是从ASCII字符集内选择一个不常见的分隔符,因为该字符将以单字节编码和UTF-8编码为相同的字节序列。

我不认为可打印的ASCII字符对于这个目的来说足够不寻常,所以一个好的选择将是控制字符之一(ASCII码1到31)。例如,STX(\x02)将符合该法案。

u正则表达式修改

在一起,这意味着你应该写这样的正则表达式:

$result = preg_match("\x02<.*?>\x02u", '<something string>'); 
+0

感谢您的解释和解决方案。这似乎已经诀窍:) –

+1

短语“扩展ASCII”让我难过。没有“8位ASCII”这样的东西;有各种8位编码设计为与ASCII **向后兼容,并且它们都有名称**。没有理由认为OP的语言环境设置为ISO 8859-1(这是您链接的页面显示的内容) - 尽管0x12的字符在CP1252和ISO 8859-15中恰好相同,这也可能是候选人。 – IMSoP

+0

再看一遍,该页面更加混乱:它开始说表格是“根据ISO 8859-1”,但随后提到了“Microsoft®Windows Latin-1扩展字符” - 换句话说,表格实际上是[Windows代码页1252](https://en.wikipedia.org/wiki/Windows-1252)。 – IMSoP