2015-04-23 73 views
2

尽管关于非英文字符正则表达式问题有很多问题,但我一直无法找到有效的答案。此外,似乎没有任何简单的PHP库可以帮助我过滤非英文输入。正则表达式验证和消毒所有英文和非英文unicode字母字符在PHP中

可否请你建议我正则表达式,这将允许

  1. 所有英文字母字符(ABC ...)
  2. 所有非英文字母字符(šýüčá...)
  3. 空间
  4. 不区分大小写

在验证以及消毒。基本上,我希望preg_match在输入包含除上述4个点以外的任何内容时返回false,或者preg_replace除去这4个类别中的所有内容。我可以从http://www.regular-expressions.info/unicode.html创建 '/^((\p{L}\p{M}*)|(\p{Cc})|(\p{Z}))+$/ui'。这个正则表达式在验证输入时效果很好,但在消毒时不起作用。

编辑:

用户输入 '捷克克鲁姆[jazyk]' 作为输入。在preg_match中使用'/^[\p{L}\p{Zs}]+$/u',该脚本确定该字符串包含不允许的字符(在本例中为'['和']')。接下来我想使用preg_replace来删除那些不需要的字符。我应该将哪个正则表达式传入preg_replace以匹配上述正则表达式未指定的所有字符?

+0

首先,你不知道上下文。其次,试图让跨国alphpabet似乎不是对我的歧视。 – ondrejba

+0

定义“消毒”。 – tchrist

+0

在这种情况下,仅仅是为了消除任何危害我网站安全的角色。 – ondrejba

回答

3

我认为,所有你需要的是一个字符类,如:

^[\p{L}\p{Zs}]+$ 

这意味着:整个字符串(或线,与(?m)选项)只能包含Unicode字母或空格。

看一看demo

$re = "/^[\\p{L}\\p{Zs}]+$/um"; 
$str = "all english alphabet characters (abc...)\nall non-english alphabet characters (šýüčá...)\nspace s\nšýüčá šýüčá šýüčá ddd\nšýüčá eee 4\ncase insensitive"; 
preg_match_all($re, $str, $matches); 

要删除不Unicode字母或空格的所有符号,使用此代码:

$re = "/[^\\p{L}\\p{Zs}]+/u"; 
$str = "český [jazyk]"; 
echo preg_replace($re, "", $str); 

sample program的输出:

český jazyk 
+0

验证时,工作就像一个魅力,谢谢。但是,当我将它插入preg_replace(preg_replace($ expr,'',$ input))时,它会在只有英文字母字符时删除整个输入('aa'=>'','ač'=>'ač “)。当我想清理输入字符串时,是否需要修改表达式? – ondrejba

+0

我不太了解preg_replace,但它应该可以合理地找到所有不在您的正则表达式中的字符,并将它们替换为无。至少这是我需要它工作的方式。 – ondrejba

+0

您可以在http://goo.gl/hgXaAe查看代码吗?我不确定你想要做什么。 '[\ W \ P {Zs}] +'会匹配所有非英文字母和非数字,非'_'和非空格。因此,所有英文字母,数字,'_'和空格都将保留在'preg_replace'之后。 –

相关问题