PHP 正则表达式分隔符

标签 php regex utf-8 cp1252

长期以来,每当我需要使用正则表达式时,我都会标准化地使用版权符号 ©作为定界符,因为它是一个不在键盘上的符号,我确定不会在正则表达式中使用它,不像 ! @ #\或/(它们有时都在正则表达式中使用)。

代码:

$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 时,是否可以使用版权符号作为标准分隔符?

最佳答案

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

另一个问题是版权字符不应用作 UTF-8 中的分隔符,因为 PCRE 函数认为 the first byte of your pattern encodes your delimiter (这可以合理地称为 PHP 中的错误)。

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

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

我认为可打印的 ASCII 字符对于此目的来说还不够不寻常,因此一个不错的选择是控制字符之一(ASCII 代码 1 到 31)。例如,STX (\x02) 就符合要求。

连同 u 正则表达式修饰符,这意味着您应该像这样编写正则表达式:

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

关于PHP 正则表达式分隔符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17725993/

相关文章:

php - ldap_add() : Add: Object class violation error

php - 如何使用 PEAR 正确安装 PHPUnit?

php - 接口(interface)常量、后期静态绑定(bind)

regex - 如何在Jmeter中使用正则表达式提取多个值

c++ - 此代码是否通用,还是仅适用于我的系统?

php - 如何在php中获取文本框值到变量并使用按钮发布它

regex - 如何使 mod_rewrite 从子域重定向到查询字符串?

python - Sublime Text 中多行的正则表达式匹配

c++ - 在 C++ 中反转 wstring

linux - 由于 Windows 和 Linux 的 Base 64 编码不匹配\n