假設我有一個文檔,我想要捕獲之前或之後有括號的字符串。如何獲取任意數目的括號之間的文本?
例子:This [is] a {{test}} sentence. The (((end))).
所以基本上我想要得到的話is
,test
和end
。
在此先感謝。
假設我有一個文檔,我想要捕獲之前或之後有括號的字符串。如何獲取任意數目的括號之間的文本?
例子:This [is] a {{test}} sentence. The (((end))).
所以基本上我想要得到的話is
,test
和end
。
在此先感謝。
根據您的病情「字符串後或之前有括號」 - 任何字都可以用OR或者僅僅跟在某種類型的圓括號之後:
$text = 'This [is] a {{test}} sentence. The (((end))). Some word))';
preg_match_all('/(?:\[+|\{+|\(+)(\w+)|(\w+)(?:\]+|\}+|\)+)/', $text, $m);
$result = array_filter(array_merge($m[1],$m[2]));
print_r($result);
輸出:
Array
(
[0] => is
[1] => test
[2] => end
[7] => word
)
問題是:應該關閉符號匹配開頭的嗎?如何處理「{{test}}」?是匹配'測試'還是'測試')?你的正則表達式給出'測試'的結果,這是 - 不要誤解我 - 沒有錯。 OP不清楚。 –
@mlambrichs。再次閱讀來自問題的描述*在**之前有括號的字符串**在**之後* – RomanPerekhrest
你的正則表達式可能是:
[\[{(]((?(?<=\[)[^\[\]]+|(?(?<={)[^{}]+|[^()]+)))
說明:在需要的if-then-else的建設,以確保開口 '{' 是對一個封閉匹配的 '}' 等
[\[{(] # Read [, { or (
((?(?<=\[) # Lookbehind: IF preceding char is [
[^\[\]]+ # THEN read all chars unequal to [ and ]
| # ELSE
(?(?<={) # IF preceding char is {
[^{}]+ # THEN read all chars unequal to { and }
| # ELSE
[^()]+))) # read all chars unequal to (and)
試試這個正則表達式:
(?<=\(|\[|{)[^()\[\]{}]+
或這一個:
(?<=\(|{|\[)(?!\(|{|\[)[^)\]}]+
Explantion(對於第一個正則表達式):
(?<=\(|\[|{)
- 正回顧後 - 尋找一個零長度匹配剛好在前面b雅{
或[
或(
[^()\[\]{}]+
- 未amoong以下任何字符的一個或多個出現次數:[
,(
,{
,}
,)
,]
解釋(用於第二正則表達式):
(?<=\(|\[|{)
- 正回顧後 - 查找只是由{
或[
或(
(?!\(|{|\[)
preceeded零長度匹配 - 負先行 - 在先前的步驟中,發現這是剛剛由開口托架前面的位置。這塊正則表達式驗證它沒有跟着另一個開頭括號。因此,匹配剛剛位於最裏面的開放括號之後的位置 - (
,{
或[
。
[^)\]}]+
- 一個或多個字符的出現不屬於這些右括號之中 - ]
,}
,)
同樣在這裏:問題是:關閉符號是否與開始符號匹配?如何處理「{{test}}」?是匹配'測試'還是'測試')?你的正則表達式給出'測試'的結果,這是 - 不要誤解我 - 沒有錯。 OP不清楚。 –
@mlambrichs檢查我的第二個正則表達式。它也涵蓋了這種情況。 – Gurman
不,它不。它明顯地匹配'([[({{ofs)}}}}})))''中的'ofs'。問題是如果這是正確的,或者如果比賽應該是'')'。 –
以下代碼適用於我。
<?php
$in = "This [is] a {{test}} sentence. The (((end))).";
preg_match_all('/(?<=\(|\[|{)[^()\[\]{}]+/', $in, $out);
echo $out[0][0]."<br>".$out[0][1]."<br>".$out[0][2];
?>
您也可以使用'[\ [\ {\(] +(\ w +)\] \} \)] +' – Mohammad
你需要的東西是這樣的:'(?:\ [+ | \ (+ | \ {+)([a-zA-Z] +)(?:\] + | \)+ | \} +)' 請參閱示例:https://regex101.com/r/2fPHIK/1/ – Viktor
澄清需要:1.是否必須匹配開頭的括號? 2.「捕獲在OR之前有括號的字符串」。這是否意味着「結束」)應該導致匹配「結束」? –