很长一段时间,任何时候我需要使用正则表达式,我已经标准化使用版权符号©
作为分隔符,因为它是一个不在键盘上的符号我肯定不会在正则表达式中使用,不像! @#\或/(有时在正则表达式中都使用它们。)
代码:
$result=preg_match('©<.*?>©', '<something string>');
然而,今天我需要使用带有重音字符的正则表达式,其中包括:
代码:
[a-zA-ZàáâäãåąćęèéêëìíîïłńòóôöõøùúûüÿýżźñçčšžÀÁÂÄÃÅĄĆĘÈÉÊËÌÍÎÏŁŃÒÓÔÖÕØÙÚÛÜŸÝŻŹÑßÇŒÆČŠŽ∂ð \,\.\'-]+
在我的IDE(Eclipse PDT)中将这个新的正则表达式包含在PHP文件中之后,我被提示将PHP文件保存为UTF-8而不是默认的cp1252。
保存并运行PHP文件后,每次在preg_match()或preg_replace()函数调用中使用正则表达式时,它都会生成一个通用的PHP警告(警告:第x行的file.php中的preg_match)和正则表达式没处理。
所以 - 两个问题:
1)是否有另一个符号可以作为分隔符使用,这种分隔符通常不会出现在我可以标准化的键盘(`~!@#$%^&*()+=[]{};\':",./<>?|\
)上,而不用担心必须检查每个正则表达式查看该符号是否实际用于表达式中的某个位置?
2)或者,当文件格式为UTF-8时,我可以使用版权符号作为标准分隔符吗?
答案 0 :(得分:4)
需要纠正的一件事是,如果您的正则表达式和/或输入数据是以UTF-8编码的(在这种情况下,它是直接来自UTF-8编码文件内),您必须使用正则表达式的u
修饰符。
另一个问题是版权字符不应该用作UTF-8中的分隔符,因为PCRE函数会考虑the first byte of your pattern encodes your delimiter(这可能被称为PHP中的错误)。
当您尝试将copyright sign用作UTF-8中的分隔符时,实际保存到文件中的是字节序列0xC2
0xA9
。 preg_match
查看第一个字节0xC2
并确定它是一个字母数字字符,因为在您当前的语言环境中,该字节对应于字符拉丁字母大写字母A带有抑扬符 {{1 (见extended ASCII table)。因此会生成警告并立即中止处理。
鉴于这些事实,理想的解决方案是从ASCII字符集中选择一个不常见的分隔符,因为该字符将以单字节编码和UTF-8编码为相同的字节序列。
我不认为可打印的ASCII字符对于此目的而言不够常见,因此一个好的选择是控制字符之一(ASCII代码1到31)。例如,STX(Â
)符合条件。
与\x02
正则表达式修饰符一起,这意味着您应该像这样编写正则表达式:
u