Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php preg_split对特殊字符不区分大小写_Php_Regex_String - Fatal编程技术网

Php preg_split对特殊字符不区分大小写

Php preg_split对特殊字符不区分大小写,php,regex,string,Php,Regex,String,我正在写一个脚本,用大写字母拆分(餐厅菜单)的字符串。不幸的是,在捷克语中,有些单词以带有变音符号的特殊字符开头。用“普通”大写字母拆分碟子效果很好,但我的正则表达式对某些特殊字符不区分大小写,它用eg.š拆分字符串,而它只应将字符串拆分为Š。奇怪的是,一些特殊的字符工作得很好,到目前为止唯一有问题的字母是š/Š。 谁能帮我一下吗 $dishes = preg_split('/(?=[ABCDEFGHIJKLMNOPQRSTUVWXYZÁČĎÉĚÍŇÓŘŠŤÚŮÝŽĹÔÄËÏÖÜŸ])/', $

我正在写一个脚本,用大写字母拆分(餐厅菜单)的字符串。不幸的是,在捷克语中,有些单词以带有变音符号的特殊字符开头。用“普通”大写字母拆分碟子效果很好,但我的正则表达式对某些特殊字符不区分大小写,它用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
regex修饰符:

$dishes = preg_split('/(?=[ABCDEFGHIJKLMNOPQRSTUVWXYZÁČĎÉĚÍŇÓŘŠŤÚŮÝŽĹÔÄËÏÖÜŸ])/u', $dishes);
注意,您需要使用UTF8编码保存PHP文件

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

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

$dishes = preg_split('/(?=\p{Lu})/u', $dishes);
请注意,有时您不必使用
/u
修饰符。见:

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

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

更多警告来自:

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

  • 如果模式本身包含无效的UTF-8字符,则会出现错误(如上述文档中所述—“模式的UTF-8有效性”) 从PHP 4.3.5开始检查模式”
  • 当主题字符串包含无效的UTF-8序列/代码点时,它基本上会导致preg的“安静死亡”_* 函数,其中没有匹配项,但没有指示 字符串是无效的UTF-8
  • PCRE认为五个和六个八位UTF-8字符序列有效(模式和主题字符串中都有效),但不支持这些字符序列 使用Unicode(请参见“安全”部分的第5.9节“字符编码”) Linux和Unix HOWTO的编程”-可在 (及其他地方)
  • 对于PHP中测试UTF-8字符串(并丢弃五/六个八位字节序列)有效性的示例算法,请参见:
  • 所以,试着

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

    根据您试图实现的目标,可能足以满足您的情况。

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

    您应该使用
    /u
    修饰符。尝试
    $disks=preg\u split('/(?)=据英国《CDCDCD基金会参考英国《基基基维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维
    可能会有过之而无不及。我想让它成为通用的,不幸的是你的代码(Lucas)根本无法拆分。添加/u也没用。该死,我使用了你的代码(Lucas的代码)它根本没有拆分,但我删除了“u”,它似乎工作得很好。谢谢!)我现在该怎么办?我是否将此标记为已批准,即使它仅部分解决了我的问题?您是否说
    $disks=preg_split('/(?=\p{Lu})/',$disks)
    适用于您?您是否将UTF8字符串拆分为字节?我添加了一些有关
    u
    标志用法的更多信息,希望能有所帮助。我不确定,我在一般情况下遇到了一些特殊标志的问题。这样做的目的只是为了填充数据库中的大量碟子,以便它只处理字符串,正如您所知,我不是专家,尤其是特别是当涉及正则表达式时:)好的,对不起,我的错误,它根本不起作用,当我使用
    $disks=preg_split('/(?=\p{Lu})/u',$disks);
    ,它根本不分裂,当我使用
    $disks=preg_split('/(?=\p{Lu})/u',$disks);
    它不被任何特殊字符分割(Ž,Ž.你把UTF8串分成几段是什么意思?