多字节字符可以在 PHP 等 PCRE 环境中用作正则表达式模式分隔符吗?

问题描述 投票:0回答: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时,有没有一种方法可以使用版权符号作为标准分隔符?

php regex utf-8 delimiter cp1252
1个回答
6
投票

需要纠正的一件事是,如果您的正则表达式和/或输入数据以 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>');
© www.soinside.com 2019 - 2024. All rights reserved.