2013-02-03 39 views
0

我希望能夠驗證下面的字符串以允許無限次的反向數據之間的數據,只要它後跟一個逗號,如果它不是逗號必須是「)」。只有反引號中才允許空格不在其中。使用preg_match重複模式

我沒有經驗過正則表達式,所以我不知道如何讓重複模式。以下是我的模式。

感謝

修訂

// first 3 lines should match 
$lines[] = "(`a-z0-9_-`,`a-z0-9_-`,`a-z0-9_-`,`a-z0-9_-`)"; 
$lines[] = "(`a-z0-9_-`, `a-z0-9_-` ,`a-z0-9_-` , `a-z0-9_-`)"; 
$lines[] = "(`a-z0-9_-`, 
    `a-z0-9_-` 
    ,`a-z0-9_-` ,`a-z0-9_-`)"; 

// these lines below should not match 
$lines[] = "(`a-z0-9_-``a-z0-9_-`,`a-z0-9_-`,`a-z0-9_-`)"; 
$lines[] = "(`a-z0-9_-``a-z0-9_-`,`a-z0-9_-`.`a-z0-9_-`"; 

$pattern = '/~^\(\s*(?:[a-z0-9_-]+\s*,?\s*)+\)$~/'; 

$result = array(); 

foreach($lines as $key => $line) 
{ 
     if (preg_match($pattern, $line)) 
     { 
      $result[$key] = 'Found match.'; 
     } 
     else 
     { 
      $result[$key] = 'Not found a match.'; 
     } 
} 

print("<pre>" . print_r($result, true). "</pre>"); 

回答

0

那麼你並不看好的括號內的數據匹配規則很清楚,你真的不指定,如果你想捕捉什麼所以...我根據代碼的上下文進行了最佳猜測,希望這可以滿足您的需求。

編輯:固定的代碼塊所以它會顯示在模式的backtics,也改變了分隔符從〜到/自OP感到困惑的是

$pattern = '/^\((\s*`[a-z0-9_-]+`\s*[,)])+$/'; 
+0

我在我的文章更新我的代碼,比較遺憾的是這是一個有點曖昧。這沒有找到匹配的任何行。有任何想法嗎? – arbme

+0

對不起,我使用了SO的內聯代碼括號,這些代碼是back-tics,因此它們在我的模式中沒有正確顯示。我改變了他們的另一種形式,所以你應該看看它的方式。同樣在我的模式中,我使用波浪號〜作爲模式分隔符,並且在代碼更新中看到您添加了正斜槓。因此,您需要刪除外部正斜槓或其他波形 –

+0

我繼續前進並編輯我的模式以使用/而不是〜因此它顯示了您應該具有的內容,因爲您被分隔符弄糊塗 –

1

你非常接近。它看起來像你想的:

$pattern = "~^\(\s*`[a-z0-9_-]+`\s*(?:,\s*`[a-z0-9_-]+`\s*)*\)$~"; 

這兩個問題與您正則表達式爲:

  1. 你有兩套分隔符(斜槓和波浪線) - 只選擇一個,並堅持下去。我的個人偏好是括號,因爲那樣你就不必「僅僅因爲分隔符」而逃脫任何東西,而且它還幫助我記住整個比賽是比賽陣列中的第一項。

  2. 通過使逗號可選,你允許你不想要的東西。解決方案確實涉及重複自己一點,但它更準確。

+0

你的模式缺少匹配的backtics,我懷疑它吃了他們一樣,在我的模式!另外,你並不需要重複這樣的子模式。 –

0

這裏是一個通用的重複模式:

preg_match_all("/start_string([^repeat_string].*?)end_string/si", $input, $output); 
var_dump($output); 
+1

回答什麼問題? – Toto