繁体   English   中英

用于解析括号和括号之间的文本的正则表达式

[英]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()

几个小点:

  1. )的否定字符类的内部也没必要进行转义。
  2. 关闭方括号(在图案的末尾)不需要转义; 正则表达式不会误认为它意味着字符类的结束。
  3. 无需声明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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM