我正在编写一个脚本,通过大写字母拆分字符串(餐厅菜单)。不幸的是,在捷克语中,一些单词以带有变音符号的特殊字符开头。通过"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字符串的有效性,需要注意的一些事情;
- 如果模式本身包含无效的UTF-8字符,则会得到一个错误(如上面的文档中所述)-"从PHP 4.3.5开始检查模式
- 当主题字符串包含无效的UTF-8序列/码点时,它基本上会导致怀孕_*的"安静死亡"函数,其中没有匹配任何内容,但没有指示字符串是无效的UTF-8
- PCRE认为5和6个八位字节的UTF-8字符序列是有效的(在模式和主题字符串中),但不支持这些在Unicode中(参见"Secure . net"的5.9节"字符编码")Linux和Unix编程HOWTO"-可以在http://www.tldp.org/等)
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解决了这个问题。