2014-01-16 44 views
1

到目前爲止,我對Prestashop提供的開箱即用功能印象深刻,但這件事真的讓我失望:如果有人想在網站上註冊或做客人退房,他可以放任何東西作爲他的名字。任何東西都包括諸如「---」之類的東西,所有的空格,「*」等等。這裏沒有驗證,這真的很煩人。驗證客戶姓名,地址和電話

我曾嘗試修改網站\ controllers \ front \ AuthController.php中的processSubmitAccount方法以使用Validate :: isName()方法,但這根本沒有任何幫助。它可以讓用戶在名稱字段中放置所有奇怪的字符。我嘗試在Validate類中創建另一個方法:

public static function isHumanName($name) 
{  
return preg_match('/^[A-Za-z]+$/', $name); 
} 

但由於某些原因,此簡單模式不起作用。我希望能夠做的就是允許像「FirstName MiddleName」這樣的名稱一次只有一個空格字符,而不是名稱的開頭。我的PHP和正則表達式技巧是最小的,這是我迄今爲止所提出的。

編輯:可接受的名稱是:

  1. 姓第二第三第四第五
  2. 名稱可以不區分大小寫。

在閱讀完評論後,我想我會放棄驗證地址,以便在下文中詳細列出。

除了名稱我想驗證地址和電話號碼。除了字母,地址可以有數字,而電話號碼只能有數字。我猜如果驗證名稱的問題得到解決,那麼我就可以對地址和數字進行驗證。

如果有人能讓我走向正確的方向,我將不勝感激。

PS:這是一個單獨的爭論,強制執行命名策略是對還是錯。 * 免責聲明:這個問題的答案並不意味着讀者在他們的生產應用程序中使用相同的東西來驗證名稱。 *

+2

我不會,見[此](HTTP: //www.kalzumeus.com/2010/06/17/falsehoods-programmers-believe-about-names/)。地址也是如此。然而,你可能會做出足夠好的表達來驗證電話號碼(但我會保持寬容)。 – Sam

+1

「O'Brien」呢?那些帶有重音或非ASCII字符的名字呢?基本上你應該接受這樣的事實:名字可能不符合某個標準。 –

+1

誰是下來選民,爲什麼? @SamSullivan查看鏈接我明白我們永遠不應該驗證名稱?那麼我怎樣稱呼一個名字是---或者是「'」的人呢?你好先生三單引號? – sttaq

回答

3
preg_match('/^[A-Za-z]+\s[A-Za-z]+$/', $name); 

將匹配:

FirstName MiddleName 

例子:http://regex101.com/r/lE5gW4

編輯:

好吧,這符合更緊密些什麼OP請求。

正則表達式:

^([A-Z][A-Za-z]+) (?:([A-Z][A-Za-z.]+))?([A-Z][A-Za-z]+)$ 

這個匹配以下變化..

FirstName M. LastName 
FirstName LastName 
FirstName MiddleName Lastname 

工作正則表達式的例子:

http://regex101.com/r/nG1vN5

注意:如果你想允許在名稱'O'Brien或任何其他字符,你可以只將它們添加到字符集。即 - ([A-Z][A-Za-z.']+)

腓例如:

$name = "FirstName M. LastName"; 

$truefalse = preg_match('/^([A-Z][A-Za-z]+) (?:([A-Z][A-Za-z.]+))?([A-Z][A-Za-z]+)$/', $name); 

echo $truefalse; 

輸出:

1 

工作的PHP例如:

https://eval.in/90720

+0

'Matt J. Smith'' Ronald O'Brien''JoséEnrique''FirstName MaidenName MarriedName' – Sam

+0

謝謝並修改你的正則表達式有點會滿足多個名字的情況,但不會與特殊字符^ [A-Za-z] +(\ s [A-Za-z] +)+ $ – sttaq

+2

@SamSullivan是的,我知道很多其他名字的可能性,但是我完全按照OP的要求回答了問題。 - **「我希望能夠做的就是允許名稱像」FirstName MiddleName「一次只有一個空格字符,而不是名稱的開頭。」** – MElliott

相關問題