2

我正在尝试使用preg_replace.

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

$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

4 回答 4

3

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

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

于 2013-06-12T15:32:09.493 回答
1

顺便说一句,您可以使用有效的希伯来语字符:\p{Hebrew}并避免使用它们\P{Hebrew}

于 2013-06-12T18:27:02.550 回答
0

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

于 2015-01-06T12:32:29.957 回答
0

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

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

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

$foo = preg_replace('/[^\x{20}-\x{7F}\x{05D0}-\x{05F2}]+/u', '', $foo);
于 2017-12-10T16:29:18.713 回答