我正在编写一个用大写字母分割字符串(餐馆菜单)的脚本。不幸的是,在捷克语中,一些单词以变音符号的特殊字符开头。通过“普通”大写字母拆分菜肴工作得很好,但我的正则表达式对一些特殊字符不区分大小写并且它将字符串拆分为例如。 š什么时候应该只用Š分割它。奇怪的是,一些特殊字符工作得很好,到目前为止唯一有问题的字母是š/Š。 有人可以帮我吗?
$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
)
(不介意第一个空行) 谢谢!
答案 0 :(得分:1)
使用PHP preg
函数中的正则表达式处理Unicode输入数据时,请记住使用/u
正则表达式修饰符:
$dishes = preg_split('/(?=[ABCDEFGHIJKLMNOPQRSTUVWXYZÁČĎÉĚÍŇÓŘŠŤÚŮÝŽĹÔÄËÏÖÜŸ])/u', $dishes);
请注意,您需要使用UTF8编码保存PHP文件!
这将使正则表达式引擎将输入视为Unicode字符串,并将正确处理包含除ASCII字符以外的正则表达式模式。
如果您需要匹配任何 Unicode大写字母,(如上面评论中提到的LucasTrzesniewski),您可以使用\p{Lu}
Unicode类别类:
$dishes = preg_split('/(?=\p{Lu})/u', $dishes);
请注意,有时您不必使用/u
修饰符。见Daniel Klein's comment:
然而,这不是必需的,因为您可能需要将utf-8序列分解为单个字节。但是,大多数情况下,如果您使用utf-8字符串,则应使用
'u'
修饰符。如果主题不包含任何utf-8序列(即仅在0x00-0x7F范围内的字符)但模式确实存在,那么就我可以解决,设置' u&#39 ;修饰符对结果没有影响。
来自hfuecks的更多警告:
关于使用/ u模式修饰符时UTF-8字符串的有效性,需要注意一些事项;
- 如果模式本身包含无效的UTF-8字符,则会出现错误(如上文所述 - " UTF-8的有效性 从PHP 4.3.5开始检查模式"
- 当主题字符串包含无效的UTF-8序列/代码点时,它基本上会导致"安静的死亡"对于preg_ * 功能,没有任何匹配但没有指示 字符串无效UTF-8
- PCRE认为五个和六个八位字节的UTF-8字符序列是有效的(在模式和主题字符串中)但不支持这些 用Unicode(参见5.9和#34;字符编码""安全 Linux和Unix编程HOWTO" - 可以在 http://www.tldp.org/和其他地方)
- 对于PHP中的一个示例算法,它测试UTF-8字符串的有效性(并丢弃五个/六个八位字节序列),前往: http://hsivonen.iki.fi/php-utf8/
醇>
所以,试试
$dishes = preg_split('/(?=\p{Lu})/u', $dishes);
可能足以满足您的需求,具体取决于您要实现的目标。
答案 1 :(得分:-1)
当我将它保存为Windows-1250时,我将PHP文件保存为UTF-8。将其保存为Windows-1250解决了这个问题。