1

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

代码:

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

4

1 回答 1

5

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

另一个问题是版权字符不应该用作 UTF-8 中的分隔符,因为 PCRE 函数认为您的模式的第一个字节编码了您的分隔符(这可能被称为 PHP 中的错误)。

当您尝试在 UTF-8 中使用版权符号作为分隔符时,实际保存到文件中的是字节序列0xC2 0xA9preg_match查看第一个字节0xC2并确定它是一个字母数字字符,因为在您当前的语言环境中,该字节对应于字符拉丁大写字母 A 和抑扬 Â符(请参阅扩展 ASCII 表)。因此会生成警告并立即中止处理。

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

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

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

$result = preg_match("\x02<.*?>\x02u", '<something string>');
于 2013-07-18T14:17:58.593 回答