Preg_split对特殊字符不区分大小写


preg_split is case insensitive with special characters

我正在编写一个脚本,通过大写字母拆分字符串(餐厅菜单)。不幸的是,在捷克语中,一些单词以带有变音符号的特殊字符开头。通过"common"大写字母分割盘子工作得很好,但是我的正则表达式对一些特殊字符不区分大小写,它用eg分割字符串。当它应该只分成Š时。奇怪的是,一些特殊字符工作得很好,到目前为止唯一有问题的字母是*/Š。有人能帮帮我吗?

$dishes = preg_split('/(?=[ABCDEFGHIJKLMNOPQRSTUVWXYZÁČĎÉĚÍŇÓŘŠŤÚŮÝŽĹÔÄËÏÖÜŸ])/', $dishes); 
print_r($dishes);
以上代码返回
Array
(
    [0] =>
    [1] => Vepřová plec na paprice s těstovinami
    [2] => Domácí sekaná s bramborovou ka
    [3] => ší
    [4] => Těstoviny s rajským jablkem, olivami a žervé
    [5] => Domácí sekaná s e svíčkovou omáčkou
    [6] => Uzená kýta s čočkou na kyselo a vejcem 
    [7] => Vepřové  nudličky se zeleninou a rýží
    [8] => Pečená vepřová plec na medu a pivu s bramborami
    [9] => Plzeňský gulá
    [10] => š
    [11] => Hovězí zadní se svíčkovou omáčkou, citron, brusinky, 
    [12] => šlehačka
)

(不介意第一个空行)谢谢你!

当您在PHP preg函数中使用正则表达式处理Unicode输入数据时,请记住使用/u正则表达式修饰符:

$dishes = preg_split('/(?=[ABCDEFGHIJKLMNOPQRSTUVWXYZÁČĎÉĚÍŇÓŘŠŤÚŮÝŽĹÔÄËÏÖÜŸ])/u', $dishes);

注意,您需要用UTF8编码保存PHP文件!

这将使regex引擎将输入视为Unicode字符串,并将正确处理包含非ASCII字符的regex模式。

如果你需要匹配任何 Unicode大写字母,(正如LucasTrzesniewski在上面的评论中提到的)你可以使用'p{Lu} Unicode分类类:

$dishes = preg_split('/(?='p{Lu})/u', $dishes);

注意,有时您不必使用/u修饰符。参见Daniel Klein的评论:

但是,这不是必需的,因为您可能需要将utf-8序列分解为单个字节。但是,大多数情况下,如果您使用的是utf-8字符串,则应该使用'u'修饰符。

如果主题不包含任何utf-8序列(即仅在0x00-0x7F范围内的字符),但模式包含,据我所知,设置'u'修饰符将对结果没有影响。

和更多来自hfueks的警告:

关于使用/u模式修饰符时UTF-8字符串的有效性,需要注意的一些事情;

  1. 如果模式本身包含无效的UTF-8字符,则会得到一个错误(如上面的文档中所述)-"从PHP 4.3.5开始检查模式
  2. 当主题字符串包含无效的UTF-8序列/码点时,它基本上会导致怀孕_*的"安静死亡"函数,其中没有匹配任何内容,但没有指示字符串是无效的UTF-8
  3. PCRE认为5和6个八位字节的UTF-8字符序列是有效的(在模式和主题字符串中),但不支持这些在Unicode中(参见"Secure . net"的5.9节"字符编码")Linux和Unix编程HOWTO"-可以在http://www.tldp.org/等)
  4. PHP中测试UTF-8字符串(并丢弃5/6个八位字节序列)有效性的算法示例如下:http://hsivonen.iki.fi/php-utf8/

所以,尝试

$dishes = preg_split('/(?='p{Lu})/u', $dishes);

可能对您的情况足够了,这取决于您想要达到的目的。

当我应该将PHP文件保存为Windows-1250时,我将其保存为UTF-8。将其保存为Windows-1250解决了这个问题。