[英]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.