2015-04-23 81 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'之後。 –

相關問題