2015-06-04 51 views
-1

我想驗證用戶輸入的名稱。我需要確保輸入的名稱'字面'有效。我在有限的知識範圍內嘗試了很多正則表達式,但他們中的任何一個看起來都不完全。例如/^[^.'-]+([a-zA-Z]+|[ .'-]{1})$/正確驗證用戶輸入的名稱

由於我正在使用的PHP網站完全使用英文,因此只允許使用英文名稱。 適用於過濾名稱規則是:

  1. 的名稱可包含任意這些字符:[a-zA-Z .'-]
  2. 名稱可以啓動僅與字母或撇號
  3. 任何的字符[ .'-]可能不會出現超過一次一段,即,「---」或「 - 」
  4. A space shoul □不遵循-'也不來之前.-

誰能請提供正確的正則表達式來實現這些?

+0

什麼希伯來語,阿拉伯語,俄語,......名字? –

+0

@CommuSoft現在,這些名字是不被考慮的。名字應該用英文輸入。無論如何,整個網站都是英文的。 – BlackPanther

+0

什麼語言(PHP,Java,JavaScript,...)? – Marvin

回答

2

這裏是爲您解決問題(在regex101演示)正則表達式:

/^(?!.*(''| |--|- |' | \.| -|\.\.|\n))['a-z][- '.a-z]*$/gi

擊穿:

(?!.*(''| |--|- |' | \.| -|\.\.|\n))負前瞻,以確保沒有翻番字符被發現

['a-z]下手其中一個字符

[- '.a-z]*其餘的也可以包括空格和破折號,並且不需要(的*代替+

+0

@KevinB:謝謝,我沒有注意到這個要求。我更新了正則表達式。 –

+0

Thanx的答覆。有用。我只是改變它以適應編輯的問題:'/ ^(?!。*(''| - - | - |'| - | \。| \。\。))['az] [ - .'az ] * $ /' – BlackPanther

1

這應該爲你工作:

/^'?([a-z]+((\.)|(')|['\- \.])?)+$/i 

Demo at regex101.com

說明:

  • '?可選擇以撇號開頭
  • ([a-z]+((\.)|(')|['\- \.])?)+然後允許1-n組中至少有1個字母字符,後跟某些(兩個)特殊字符的有效組合。這些是". "," '"(引號看空格)或任何單個特殊字符。
  • /i不區分大小寫,否則您只需指定[a-zA-Z]而不是[a-z]

我不確定John,.Doe'應該被視爲有效名稱。用我的表達他們不會。

+0

它的工作原理除非空格跟在'。'之後。例如:'John Doe M. R.'。還必須允許像'O'Brien'這樣的名字。 – BlackPanther

+0

@BlackPanther:正確。我已經更新了我的答案。 – Marvin

+0

現在它工作完美。我將它與兩個答案進行了比較,並發現Brian的答案,保留了大多數測試用例中較少的步驟。所以,我選擇了這個正確的答案。再次感謝。 :) – BlackPanther

0

通過限制一個巨大的斷言必須做的所有回溯,你可能會獲得更好的性能。

事情是這樣的..

# (?i)^(?=[a-z'])(?:[a-z]+|([ ](?!-)(?<!'[ ])|[.'-])(?!\1))*$ 

(?i)     # Modifier, case insensitive 
^     # BOS 
(?= [a-z'])   # Starts with an alpha or apos ' 

(?:     # Cluster 
     [a-z]+    # 1 to many alpha's 
    |      # or 
     (     # (1 start), Capture group, one of [ .'-] 
      [ ]     # Single space 
      (?! -)    # not a dash - ahead 
      (?<! ' [ ])   # nor apos space '[ ] behind 
     |      # or, 
      [.'-]    # Single dot . or apos ' or dash - 
    )     # (1 end) 
     (?! \1)    # Backref capt grp 1, 
          # not adjacent duplicate of one of [ .'-] 
)*     # Cluster end, do 0 to many times 
$     # EOS