2012-11-08 20 views
1

我的帳戶創建腳本的名稱輸入驗證與preg_match作爲現場只允許要麼拉丁西里爾字符(換句話說,它不能兼得),但是,不管是什麼名字字段包含,preg_match條件永遠不會滿足。到目前爲止,我已經嘗試了三種可能的代碼變體:的preg_match從未經過

if (!(preg_match('/^[a-z]$/i',$_POST['name']) || preg_match('/^[а-я]$/i',$_POST['name']))) back('The message'); 

if (!preg_match('/^[a-z]$/i',$_POST['name']) && !preg_match('/^[а-я]$/i',$_POST['name'])) back('The message'); 

以及試圖將兩個preg匹配塞入一個的嘗試。

任何人都可以請幫我解決這個問題嗎?

+0

嘗試啓用UTF模式預浸料? '.../iu' –

+0

@MarcB感謝您的回覆,但它沒有奏效。 –

回答

4

的問題是,你是限制名稱中的一個字符:

/^[a-z]$/i 

將其更改爲:

/^[a-z]+$/i 

/^[а-я]+$/i 
+2

由於前段時間我花了相當長的時間學習正則表達式,實際上我很尷尬,我沒有注意到這一點;一定是累了。非常感謝你! –

1

讓我們抽象這些preg_match功能於閱讀名稱is_latinis_cyrillic能力。然後,您正在尋找的邏輯:

if is_latin xor is_cyrillic  -> OK 
else       -> not OK 

或者,倒立:

if !(is_latin xor is_cyrillic) -> not OK 

xor是唯一真正的,如果一個是true和其他false

此外,您的regexen只匹配一個字符。你需要/^[a-z]+$/i匹配整個單詞。此外,要匹配非拉丁字/正則表達式,您需要使用u修飾符,如/^[а-я]+$/iu,並確保您的源代碼和主題以UTF-8編碼。所以:

if (!(preg_match('/^[a-z]+$/i', $_POST['name']) xor preg_match('/^[а-я]+$/iu', $_POST['name']))) { 
    // error 
} 

你甚至可以縮短到一個正則表達式是:

if (!preg_match('/^([a-z]+|[а-я]+)$/iu', $_POST['name'])) { 
    // error 
} 
1

你也可以斷言無論是在一個正則表達式:

if (!preg_match('/ ^[a-z]+$ | ^[\p{Cyrillic}]+$ /ixu',$_POST['name'])) { 

注意兩個|方案,機器人通過限制^$

還有\p{Latin},而不僅僅是\p{Cyrillic}匹配完整的字符範圍。

0

隨着你的病情,如果第一個「如果」沒有通過,第二個也不會因爲他們是等價的!(A or B) <=> !A && !B你想要的是一個異

而且,你只是測試只有一個字符,你的「 preg match「在這裏。

你的條件應該是

if(preg_match('/^[a-z]+$/iu',$_POST['name']) xor preg_match('/^[а-я]+$/iu',$_POST['name']){ 

    // do what you want 

    } 
+0

這就是爲什麼我說這些只是我試圖解決這個問題的兩個變種。 –

+0

好的,所以使用xor並添加「+」 – artragis