2012-07-11 187 views
0

我在下面創建了一個正則表達式(使用php);其必須與包含的給定字符串中的全部terms相匹配a-z0-9,.,_-正則表達式不起作用

我的表達是:'~(?:\(|\s{0,},\s{0,})([a-z0-9._-]+)(?:\s{0,},\s{0,}|\))$~i'

我的目標字符串是:('word', word.2, a_word, another-word)。 在結果預計terms是:word.2a_wordanother-word

我目前得到:another-word

我的目標

我檢測從我的目標字符串MySQL的功能,能正常工作。然後我需要從該目標字符串中的所有字段。這是爲我自己的ORM。

我想可能會出現這樣一種情況,即在該表達式中包含進一步的括號。

+0

提示:'{0,}'與'*'相同。 – deceze 2012-07-11 08:39:01

+0

可以引用括號中的任何術語,或只引用第一個術語?可以有任意數量的引用條款嗎?也許你可以向我們展示一些你的輸入例子。 – Flimzy 2012-07-11 08:43:52

+1

另外,你是否需要處理嵌套的括號?所有括號是否總是正確平衡?引用字符串中是否可以有括號?引用字符串中是否有(引號或其他)引號?如果你想要一個正則表達式來處理這個問題,你需要解決這些問題。 – 2012-07-11 08:45:23

回答

1

從我可以告訴,你必須用逗號分隔的術語列表,並希望找到只滿足[a-z0-9._\-]+的人。如果是的話,這應該是正確的(它返回你的榜樣,至少正確的結果):

'~(?<=[,(])\\s*([a-z0-9._-]+)\\s*(?=[,)])~i' 

的主要問題是:

  • $結尾,這是錨定查詢到字符串
  • 當匹配所有你從以前的比賽結束繼續的結束 - 這意味着,如果你在一個比賽結束匹配逗號/右括號它不存在,在比賽的下一個的開始。我已經用向後看((?<=...)和向前看((?=...
  • 解決了這個問題。反斜槓需要被雙重轉義,因爲解析字符串時,第一個反斜槓可能被PHP剝離。

編輯:既然你在一個評論說,有些條款可能包含你首先要運行您的輸入逗號通過這個字符串:

$input = preg_replace('~(\'([^\']+|(?<=\\\\)\')+\'|"([^"]+|(?<=\\\\)")+")~', '"STRING"', $input); 

應全部更換琴絃''STRING'',對於匹配其他正則表達式可以很好地工作。

+0

感謝您的明確回覆,很高興能夠比我更好地理解正則表達式。 – ash 2012-07-11 14:13:19

1

也許使用正則表達式是矯枉過正。在這種文本中,您可以刪除括號並用逗號分隔字符串。

+1

正確。使用正則表達式'([^)] *)'來匹配字符串的整個括號部分,然後使用普通的舊字符串函數 - 「爆炸」和朋友 - 來完成剩下的工作。 – 2012-07-11 08:48:37

+0

如果在引用字符串中出現逗號,該怎麼辦? – 2012-07-11 08:48:38

+0

噢,他應該知道什麼可以出現在他的字符串中,而不是我。我的觀點是如果可以的話,避免使用正則表達式。 – drupality 2012-07-11 08:49:53