这是我的代码:
preg_replace('/[^{Hebrew}a-zA-Z0-9_ %\[\]\.\(\)%&-]/s', '', $q);
它应该只接受a-z,A-Z,0-9,任意数量的单个空格和希伯来字符。
我在许多方面尝试过,但却无法让它发挥作用。
提前致谢!
答案 0 :(得分:4)
在PCRE中,\p{xx}
和\P{xx}
可以使用Unicode category名称或Unicode script名称。该列表可在PHP documentation或PCRE man page中找到。
对于希伯来语脚本,您需要使用\p{Hebrew}
。
我还删除了\
,.
,(
的转义)
,因为它们已经在字符类[]
中失去了特殊含义。 s
标志(DOTALL
)没用,因为正则表达式中没有点元字符。
preg_replace('/[^\p{Hebrew}a-zA-Z0-9_ %\[\].()&-]/', '', $q);
来自Unicode FAQs。它解释了块和脚本之间的区别。为了您的信息,PCRE仅支持匹配Unicode脚本和Unicode类别(字符属性)。
问:如果Unicode块不是代码页,它们是什么?
答:Unicode标准中的块是命名的代码点范围。它们用于帮助将标准组织成相关类型字符的分组,以方便参考。图表程序使用它们来定义一起打印的字符范围,用于书中看到的代码图表或在线发布。
问:Unicode块是否定义了字符属性?
答:不可以。字符属性与编码字符本身相关联,而不是与它们编码的块相关联。
问:这是否适用于字符脚本?
答:是的。例如,泰语块包含具有泰语脚本属性的泰语字符,但它还包含泰铢货币符号的字符,当然,泰语文本在泰语文本中使用,但其定义为具有公共脚本属性。要查找任何字符的脚本属性值,您需要依赖Unicode Character Database数据文件Scripts.txt,而不是单独使用块值。
问:那么块值与脚本值不一样?
答:正确。在某些情况下,例如拉丁语,编码的字符分布在十几个不同的Unicode块中。这是不幸的,但仅仅是标准历史的结果。在其他情况下,单个块可能包含多个脚本的字符。例如,希腊语和科普特语块主要包含希腊语脚本的字符,但也包含科普特语脚本的一些历史字符。
答案 1 :(得分:0)
您应该将文件更改为utf 8编码,例如:notepad ++ go to encoding - >编码为UTF-8。并且它工作:preg_replace('/[^\p{Hebrew}a-zA-Z0-9_ %[].()&-]/u','', $q)
我还添加了“u”作为修饰符。