2011-04-26 167 views
1

我想(在PHP)正則表達式的幫助:逗號分隔的列表

  1. 驗證一個textarea的內容有效
  2. 將它們分開到令牌處理

爲了被認爲是有效的,它必須是僅包含數字和字母形成一個「代碼」,即從任意位置中的3-6長度的字符串,和用來將它們分開的逗號。我已經打破了這樣的東西是這樣的:

[A-Za-z0-9]{3,6}, 

我很難完成它雖然。我希望他們能夠與任何一個逗號,或者空格和逗號空格,逗號空間,等等。我只希望這是一個逗號如果有下列有效令牌分開。

例如,輸入字符串:

阿部123,PlE43,54drt,r2344

應分離成以下標記:

'ABE 123' 和'PlE43'and'54drt'and'r2344'

How我可以修復我的正則表達式以適應條件嗎? (現在我有麻煩的逗號可選的,但如果是有我期待着另一個有效令牌,以及使用逗號和之前或之後作爲一個有效的分隔空間的任意組合)

+1

這是一個**代幣嗎? 'abe 123' – Jon 2011-04-26 15:16:18

+0

@Jon yes這個「code」是一個標記 – Diego 2011-04-26 15:17:48

+1

所以標記應該定義爲'[A-Za-z0-9] {3,6}'。注意空間。 – KarlsFriend 2011-04-26 15:25:01

回答

7

假設你想塌陷(令牌內即兩個空間和令牌/旁邊逗號之間的空隙應該被忽略)的所有空間,你可以用一些預處理更簡單地做到這一點。

$input = 'abe 123, PlE43,54drt , r2344'; 
$input = str_replace(' ', '', $input); // strip all spaces 
$tokens = explode(',', $input); 
foreach ($tokens as $token) { 
    if(!preg_match('/^[A-Za-z0-9]{3,6}$/', $token)) { 
     // error 
    } 
} 

如果你有兩個連續的逗號這段代碼也將報告錯誤,或者如果你最終用逗號分隔的輸入字符串,因爲這會產生$tokens空元素不通過3驗證-6字母數字規則。

See it in action

更新:保留空間令牌,將需要稍作修改:

$input = 'abe 123, PlE43,54drt , r2344'; 
$tokens = explode(',', $input); 
foreach ($tokens as &$token) { 
    $token = trim($token); 
    if(!preg_match('/^[A-Za-z0-9]{3,6}$/', str_replace(' ', '', $token))) { 
     // error 
    } 
} 

要小心一點,雖然,因爲它認爲

a   b      42 

是一個有效的令牌。

+0

請注意,在您的示例中,這也將剝離「abe 123」的空間。提問者可能想保留這一點。 – 2011-04-26 15:27:46

+0

@Justin Morgan我想保留這個空間。即使@Jon在他的回答中確實提到了,是否有辦法修改它以保留這個空間? – Diego 2011-04-26 15:29:50

+1

@Diego:看到更新,但也要記住,3對6的規則可能與「空格很好」規則奇怪地相互作用。 – Jon 2011-04-26 15:35:31

0

試試這個:

[A-Za-z0-9]{3,6}((\s*\,\s*)[A-Za-z0-9]{3,6}|(\s)*) 
0

這個規則表達式可以做的工作。

^([A-Za-z0-9]{3,6} *, *)*[A-Za-z0-9]{3,6}$ 

它首先查找任何數目的令牌,隨後是sperator。然後它期望一個單一的令牌。 在這種情況下,在逗號前後允許有任意數量的空格。你可能想調整。

您的示例將不匹配,因爲它在第一個標記(不帶逗號)中包含空格。如果你想讓它通過,你應該將空間添加到有效的字符標記列表中。

0

我會使用以下方法:

/^(?:([A-Za-z0-9\s]{3,6})\s*(?:,\s*|$))*/ 

的,它將每個文本域的內容爲捕獲組1。注意,我已經修改了[A-Za-z0-9][A-Za-z0-9\s],這將使你的abe 123例如空白。這也將修剪逗號周圍的空白。

請注意,這不會修剪字符串的開頭和結尾的空格。爲了一致性,我建議你也修剪一下。做到這一點的正則表達式是:

/^(?:\s*([A-Za-z0-9\s]{3,6})\s*(?:,|$))*/ 

還有一個更新:如果您想要忽略空格在3-6字符數,你可以這樣做:

/^(?:((?:\s*[A-Za-z0-9]\s*){3,6})(?:,|$))*/ 

測試您的示例數據:http://refiddle.com/10t

1

假設的要求:

  • 每個令牌是由字母,數字和空格,但必須CONT至少一個字母和至少一個數字。
  • 標記的總長度爲3-6個字符,其中包含任何內部空格。
  • 假設3-6字符長度限制包含任何空格。 (因此:具有7個字符的「abe 123」將是無效的。)
  • 鑑於分隔令牌的逗號可以具有可選的空白(將被忽略),這意味着令牌可能永遠不會開始或結束與一個空間(但可能包含嵌入空間)。

這是一個經過測試的PHP函數,用於驗證給定的字符串並返回包含有效令牌的數組。如果該字符串無效,則返回false。

// Return array of valid tokens else false if $text is invalid. 
function valid_tokens($text) { 
    $re_validate = '/ 
     # Validate comma separated TEXTAREA "Codes" tokens. 
     ^      # Anchor to start of string. 
     \s*+      # Optional leading whitespace. 
     (?:      # Group comma separated tokens. 
      (?=[0-9 ]{0,5}[A-Za-z]) # Must contain at least one letter. 
      (?=[A-Za-z ]{0,5}[0-9]) # Must contain at least one digit. 
      [A-Za-z0-9]    # First char is number or digit. 
      [A-Za-z0-9 ]{1,4}  # Middle chars numbers, digits or spaces. 
      [A-Za-z0-9]    # Last char is number or digit. 
      \s*      # Optional whitespace following token. 
      (?:      # Group for "end of token" options. 
      ,\s*     # Either a comma, optional whitespace, 
      | $      # or end of string. 
     )      # End "end of token" options group. 
     )++      # One or more tokens required. 
     $       # Anchor to end of string. 
     /x'; 
    // Check validity of comma separated tokens (tokens may contain spaces). 
    if (preg_match($re_validate, $text)) { 
     $re_match = '/ 
      # Match next comma separated token. Capture in group $1. 
      \s*+     # Discard optional leading whitespace. 
      (     # $1: Comma separated token. 
       [A-Za-z0-9]  # First char is number or digit. 
       [A-Za-z0-9 ]{1,4} # Middle chars numbers, digits or spaces. 
       [A-Za-z0-9]  # Last char is number or digit. 
      )     # End $1: Comma separated token. 
      \s* ,?    # Discard comma separator if its there. 
      /x'; 
     preg_match_all($re_match, $text, $matches); 
     return $matches[1]; // Return array of valid tokens. 
    } 
    // Case 2: TEXTAREA does not contain valid tokens. Return false. 
    else return FALSE; 
} 

此腳本使用兩個主要的正則表達式;一個用於驗證逗號分隔標記的整個字符串,另一個用於提取每個值。

編輯:我原來對這個問題的解讀使它比它所需要的更加複雜。這個簡化版本只允許用逗號分隔標記。

相關問題