2013-04-02 32 views
1

我有一個字符串(可以是任何長度,最多255個字符),這將需要檢查每個單個字符並確保它只包含以下字符(可以按任何順序):正則表達式只傳遞整個字符串中的某些字符

  • 字母(az大小寫敏感所以也AZ)
  • 數字(0-9)
  • 連字符( - )
  • 號(&)
  • 單引號(')
  • 句號(。)
  • 斜槓(/)
  • 空單隻(理想情況下這將是很好,如果這可以單獨標記,讓我刪除的任何其他不必要的空格)

所以例如,下面將接替

唐寧街10號

但下面不會

10,唐寧街

是正則表達式能夠做到這一點?將使用PHP preg_match函數。

感謝提前:)

+3

到目前爲止您提出了什麼模式? – PeeHaa

+0

是的可能:)你可以嘗試一些,然後人們會幫助你 – 2013-04-02 11:31:23

+0

當然,我的正則表達式是絕對廢話 - 我得到這個:/([a-zA-Z0-9])/但它只檢查第一個字符 - 抱歉我的愚蠢:(任何首發與解釋將是有用的,不需要整個解決方案,如果它需要很多時間:) – user1197220

回答

2

單字符匹配可以用一個字符類,類似於做什麼,你已經嘗試:

[a-zA-Z0-9\-&'./] 

你可以這樣指定,可以有大於或等於一個任意數量這些字符後加上+即可。但是由於您要驗證的長度不應超過255個字符,因此您可以使用明確的量詞來執行此操作:{0,255}允許從零到255的任何長度。請注意,連字符會被轉義,因爲它具有特殊含義一個角色類。您可以使用i修飾符使該模式不區分大小寫,從而使其更簡單一些。

匹配單個空間的要求是一個更復雜,有幾種方法可以完成,但既然你也說你想要規範化這些到一個空間,我建議你先這樣做所以爲了簡單起見,你可以給角色類添加空間。這可以很容易地與另一個正則表達式來完成:

/ +/ 

這1個或多個空格字符的每個塊匹配,所以你然後只需用一個空格替換所有的匹配。

既然您知道該字符串只包含單個空格,您可以通過使用^$主題斷言的開始和結束簡單地聲明整個字符串僅包含列表中的字符。所以,把他們放在一起,你會得到這樣的事情:

// Replace all space blocks to a single space 
$normalizedSpace = preg_replace('# +#', ' ', $input); 

// Validate the input contains only the chars you want 
if (!preg_match('#^[a-z0-9\-&\'./ ]{0,255}$#i', $normalizedSpace)) { 
    // Data invalid, handle error here 
} else { 
    // If you get here the data is valid 
    $validData = trim($normalizedSpace); 
} 

我懷疑你也將要trim()數據爲好,儘管這可能並非如此。

0

這將匹配允許的字符,允許多達255個字符(或空字符串)。

/^[a-z0-9'.\/& -]{0,255}$/iD 
相關問題