preg_replace不接受unicode

时间:2013-06-12 15:29:40

标签: php regex string

我正在尝试使用preg_replace仅保留字符串中的有效字符和希伯来语Unicode字符。

我在这个字符串上收到错误:

$PLAINText1 = preg_replace('/[^(\x20-\x7F),(\x05D0-\x05F2)]*/','', $PLAINText);

错误是:

  

编译失败:在...中的偏移25处的字符类中无序排列。

我已经知道错误仅在此短语中:(\x05D0-\x05F2)

我在这里阅读了很多关于这个问题的帖子,并没有找到解决方案。一篇相关的帖子建议在Unicode中添加},所以在这个字符串上:

$PLAINText1 = preg_replace('/[^(\x20-\x7F),(\x{05D0}-\x{05F2})]*/','', $PLAINText);

我遇到了另一个错误:

  

\x{...}序列中的字符值在偏移量22 ...

时太大

请帮忙。

4 个答案:

答案 0 :(得分:3)

\x只接受两个十六进制数字,因此您的范围转换为“ENQ字符,D,0和ENQ之间的任何内容(这是错误),F或2”

尝试在正则表达式的末尾添加Unicode修饰符u,并使用\x{05D0}明确告诉它使用多少个字符作为十六进制数。

答案 1 :(得分:1)

除非另行通知,否则您可以使用\p{Hebrew}包含有效的希伯来字符,并使用\P{Hebrew}

来避免使用这些字符

答案 2 :(得分:0)

您应该将文件更改为utf 8编码,例如:notepad ++ go to encoding - >编码为UTF-8并且shudold工作:preg_replace('/[^\p{Hebrew}a-zA-Z0-9_ %[].()&-]/u','', $q)我还添加了“u”作为修饰符。

答案 3 :(得分:0)

下面将替换除alphanumaric,希伯来语和下划线之外的任何unicode字符。

$foo = preg_replace('/[^\w\x{05D0}-\x{05F2}]+/u', '', $foo);  

以下将替换除ASCII字符之外的任何unicode字符,从20到127和希伯来语。

$foo = preg_replace('/[^\x{20}-\x{7F}\x{05D0}-\x{05F2}]+/u', '', $foo);