用于验证和清理PHP中所有英语和非英语unicode字母字符的正则表达式

时间:2015-04-23 08:38:04

标签: php regex

虽然关于非英文字符正则表达式问题有很多问题,但我找不到合适的答案。此外,似乎没有任何简单的PHP库可以帮助我过滤非英语输入。

请你给我一个正则表达式,允许

  1. 所有英文字母字符(abc ...)
  2. 所有非英文字母字符(šýüčá...)
  3. 空间
  4. 不区分大小写
  5. 验证和消毒。基本上,我希望preg_match在输入包含除上述4个点以外的任何内容时返回false,或者preg_replace除去这4个类别之外的所有内容。

    我能够创造 来自http://www.regular-expressions.info/unicode.html'/^((\p{L}\p{M}*)|(\p{Cc})|(\p{Z}))+$/ui'。这个正则表达式在验证输入时效果很好,但在清理时却不行。

    编辑:

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

1 个答案:

答案 0 :(得分:3)

我认为你需要的只是一个角色类:

,

这意味着:整个字符串(或带有^[\p{L}\p{Zs}]+$ 选项的行)只能包含Unicode字母或空格。

查看demo

(?m)

要删除非Unicode字母或空格的所有符号,请使用以下代码:

$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);

sample program的输出:

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