For*_*low 1 php regex utf-8 cp1252
很长一段时间以来,每当我需要使用正则表达式时,我都标准化使用版权符号©作为分隔符,因为它不是键盘上的符号,我肯定不会在正则表达式,不像!@ # \ 或 / (有时都在正则表达式中使用)。
代码:
$result=preg_match('©<.*?>©', '<something string>');
Run Code Online (Sandbox Code Playgroud)
但是,今天我需要使用带有重音字符的正则表达式,其中包括:
代码:
[a-zA-Zàáâäãå???èéêëìíîï??òóôöõøùúûüÿý??ñç?šžÀÁÂÄÃÅ???ÈÉÊËÌÍÎÏ??ÒÓÔÖÕØÙÚÛÜŸÝ??ÑßÇŒÆ?ŠŽ?ð \,\.\'-]+
Run Code Online (Sandbox Code Playgroud)
在我的 IDE (Eclipse PDT) 的 PHP 文件中包含这个新的正则表达式后,系统提示我将 PHP 文件保存为 UTF-8 而不是默认的 cp1252。
保存并运行 PHP 文件后,每次我在 preg_match() 或 preg_replace() 函数调用中使用正则表达式时,它都会生成一个通用的 PHP 警告(警告:第 x 行 file.php 中的 preg_match)并且没有处理正则表达式.
所以——两个问题:
1) 是否有另一个符号可以很好地用作分隔符,通常在键盘 ( `~!@#$%^&*()+=[]{};\':",./<>?|\)上找不到,我可以对其进行标准化,而不必担心必须检查每个正则表达式以查看是否实际使用了该符号表达式中的某处?
2)或者,当文件格式为UTF-8时,是否可以使用版权符号作为标准分隔符?
需要更正的一件事是,如果您的正则表达式和/或输入数据是用 UTF-8 编码的(在这种情况下是这样,因为它直接来自 UTF-8 编码文件的内部),您必须u为您的正则表达式。
另一个问题是版权字符不应该用作 UTF-8 中的分隔符,因为 PCRE 函数认为您的模式的第一个字节对您的分隔符进行编码(这可能被称为 PHP 中的错误)。
当您尝试在 UTF-8 中使用版权符号作为分隔符时,实际保存到文件中的是字节序列0xC2 0xA9。preg_match查看第一个字节0xC2并确定它是一个字母数字字符,因为在您当前的语言环境中,该字节对应于带有抑扬 符的拉丁大写字母 AÂ(请参阅扩展 ASCII 表)。因此会生成警告并立即中止处理。
鉴于这些事实,理想的解决方案是从 ASCII 字符集中选择一个不寻常的分隔符,因为该字符将在单字节编码和 UTF-8 中编码为相同的字节序列。
我认为可打印的 ASCII 字符不足以用于此目的,因此一个不错的选择是控制字符之一(ASCII 代码 1 到 31)。例如,STX ( \x02) 就符合要求。
与u正则表达式修饰符一起,这意味着您应该像这样编写正则表达式:
$result = preg_match("\x02<.*?>\x02u", '<something string>');
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
681 次 |
| 最近记录: |