[英]Regex for parsing text between brackets and parenthesis
我想創建一個正則表達式,將所有$text1
和$text2
在兩個分離數組中。 text1和text2是:( ($text1)[$text2]
,存在於字符串中。
我寫了這段代碼來解析括號:
<?php
preg_match_all("/\[[^\]]*\]/", $text, $matches);
?>
它工作正常。
我寫了另一個代碼來解析parantheses:
<?php
preg_match('/\([^\)]*\)/', $text, $match);
?>
但它只是解析其中一個parantheses而不是字符串中的所有parantheses :(
所以我有兩個問題:
1)如何解析字符串中所有parantheses之間的文本?
2)如何按照我在頂部描述的那樣達到
$text1
和$text2
?
請幫我。 我對正則表達式很困惑。 如果你有一個很好的資源共享鏈接。 謝謝 ;)
將preg_match_all()
與以下正則表達式一起使用:
/(\[.+?\])(\(.+?\))/i
細節
/ # begin pattern
( # first group, brackets
\[ # literal bracket
.+? # any character, one or more times, greedily
\] # literal bracket, close
) # first group, close
( # second group, parentheses
\( # literal parentheses
.+? # any character, one or more times, greedily
\) # literal parentheses, close
) # second group, close
/i # end pattern
這將保存一個數組中括號之間的所有內容,以及另一個數組中括號之間的所有內容。 所以,在PHP中:
<?php
$s = "[test1](test2) testing the regex [test3](test4)";
preg_match_all("/(\[.+?\])(\(.+?\))/i", $s, $m);
var_dump($m[1]); // bracket group
var_dump($m[2]); // parentheses group
您未能捕獲多個(
)
包裝的子字符串的唯一原因是因為您調用的是preg_match()
而不是preg_match_all()
。
幾個小點:
)
的否定字符類的內部也沒必要進行轉義。 i
模式修飾符,您的模式中沒有要修改的字母。 將您的兩種模式合二為一,烘烤我的小點,您就擁有了完全精致/優化的模式。
如果您不知道為什么您的模式很棒,我會解釋。 你看,當你要求正則表達式引擎匹配“貪婪”時,它可以更有效地移動(減少步驟)。
通過使用否定的字符類,您可以使用貪婪匹配。 如果你只使用.
那么你必須使用“懶惰”匹配( *?
)來確保匹配不會“走得太遠”。
模式: ~\\(([^)]*)\\)\\[([^\\]]*)]~
(11步)
以上將捕獲括號中的零個或多個字符作為捕獲組#1,並將方括號之間的零個或多個字符捕獲為捕獲組#2。
如果您知道您的目標字符串將遵循您的嚴格格式,您甚至可以從模式中刪除最終]
以提高效率。 (10個步驟)
比較這與懶惰.
匹配。 ~\\((.*?)\\)\\[(.*?)]~
(35步)這只是你的小16字符輸入字符串。 隨着文本長度的增加(我只能想象您將這些子字符串定位在更大的文本塊中),性能影響會變得更大。
我的觀點是,總是嘗試設計使用“貪婪”量詞的模式,以追求最佳/最有效的模式。 (關於提高效率的進一步提示:避免使用管道( |
),避免捕獲組,並在合理的情況下避免使用外觀,因為它們需要花費步驟。)
代碼:( 演示 )
$string='Demo #1: (11 steps)[1] and Demo #2: (35 steps)[2]';
var_export(preg_match_all('~\(([^)]*)\)\[([^\]]*)]~',$string,$out)?array_slice($out,1):[]);
輸出:(我用array_slice()
修剪了全字符串匹配)
array (
0 =>
array (
0 => '11 steps',
1 => '35 steps',
),
1 =>
array (
0 => '1',
1 => '2',
),
)
或者根據您的使用情況:(使用PREG_SET_ORDER
)
代碼:( 演示 )
$string='Demo #1: (11 steps)[1] and Demo #2: (35 steps)[2]';
var_export(preg_match_all('~\(([^)]*)\)\[([^\]]*)]~',$string,$out,PREG_SET_ORDER)?$out:[]);
輸出:
array (
0 =>
array (
0 => '(11 steps)[1]',
1 => '11 steps',
2 => '1',
),
1 =>
array (
0 => '(35 steps)[2]',
1 => '35 steps',
2 => '2',
),
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.