2012-11-10 111 views
2

什麼樣的正則表達式模式可以用於使用圓括號對中的以下點查找單詞。匹配包裹的圖案

as。 df.kj hlasfa(asd。 las kdfh。)dfs adk jfh。一個(sd.kf)JHD(DSK FH。)dskfdf ASDF DFS lkjh asdfdsfjkhlkjh(ASDF。)作爲fadf ASF

期望的結果以粗體顯示。

+0

應(sd.kf)也被加粗? – HamZa

+0

@HamZaDzCyber​​DeV不應該 – PHPst

+0

你嘗試過那種方法不起作用? – rdlowrey

回答

2

一個多的選擇是:

\b[a-zA-Z]+[.](?=[)])(?=[^(]*[)])   
+0

@Reza - 沒有向後看。第一個肯定的前瞻'(?= [)])'確保在期間後面有一個空格或者結束圓括號。第二個肯定性前瞻'(?= [^(] * [)])'確保在後面的圓括號之後出現圓形括號,並且在該期間和該圓形括號之間沒有開頭的圓括號。 –

3

你可以使用一個lookahead,斷言有下一個關閉一個之前沒有開括號:

preg_match_all('/[a-zA-Z]+\.(?![a-zA-Z])(?=[^()]*\))/', $input, $matches); 

你會發現在四場比賽中$matches

第一個負面預測消除了HamZa在評論中提到的情況。第二個(肯定的)lookahead試圖在下一個開場之前找到右括號。

這裏有一個警告。一旦你嵌套括號,這將開始崩潰。 some(text. (here))將不匹配text.。嵌套模式(使用括號可能會出現)通常超出正則表達式的範圍,儘管某些引擎可以部分處理它們。如果這是你的情況,你最好手動瀏覽字符串並計算括號。

+0

謝謝,這裏不是遞歸嗎? – PHPst

+0

@Reza在PHP遞歸中,只有檢查輸入字符串的正確結構纔有意義。對於匹配和替換它並不適用,因爲每個捕獲組只能得到一個結果。所以所需模式的嵌套事件不能一次性檢索。 –

+0

再次感謝。我迷茫!你能否再詳細解釋一下第二個lookahead。 – PHPst