【问题标题】:Capturing text between two groups of square brackets in PHP在 PHP 中捕获两组方括号之间的文本
【发布时间】:2017-09-17 04:23:14
【问题描述】:

我需要一些方法来捕获两组方括号之间的文本。 例如,下面的字符串:

test test [foo] bar [/foo] test

我需要输出“bar”,但“bar”是可变词

我怎样才能得到我需要的输出?

【问题讨论】:

    标签: php regex


    【解决方案1】:

    preg_match('/\[([^\]]+)\](.*?)\[\/\1\]/', $text)

    使用反向引用将第一个方括号标记与其结束标记匹配。请注意,如果您想允许嵌套相同的标签,或者将嵌套标签视为纯文本以外的任何内容,这将不起作用。

    【讨论】:

      【解决方案2】:

      也许用这个简单的表达方式:

      preg_match('/\](.*)\[/', 'test test [foo] bar [/foo] test', $match);
      echo trim($match[1]);
      

      【讨论】:

        【解决方案3】:

        我猜back references 如果您关心标签的准确匹配,将会很有帮助。使用正则表达式:

        $text = 'test test [foo] bar [/foo] test';
        preg_match('/\[([^\]]+)\](.*?)\[\/\1\]/', $text, $matches);
        do_work($matches[2]); // maybe trim it
        // and more
        

        让我给你解释一下。首先,我在模式的第一部分添加(...)(匹配[xxx])使其成为子模式。然后我们可以使用\1 来引用它的匹配项(而1 是子模式的数字位置,从左开始计数,从1 开始)。您可以查看上面的链接以获取更多信息。 (我的英语很差,所以解释可能不清楚。)


        另外,您可以给子模式一个名称(称为命名子模式),例如:

        /\[(?P<tag_name>[^\]]+)\](.*?)\[\/(?P=tag_name)\]/is
        

        来自 PHP 手册:

        • 可以使用语法(?P&lt;name&gt;pattern) 命名子模式。然后,该子模式将在匹配数组中按其正常数字位置和名称进行索引。有两种替代语法(?&lt;name&gt;pattern)(?'name'pattern)
        • 可以通过(?P=name)\k&lt;name&gt;\k'name'\k{name}\g{name}\g&lt;name&gt;\g'name' 实现对命名子模式的反向引用。

        当可以嵌套相同类型的标签时要小心。想一想:

        test
        test
        [foo][foo]bar[/foo][/foo]
        test
        

        那我们可能需要见Regular expression for nested tags (innermost to make it easier)

        【讨论】:

          猜你喜欢
          • 2012-04-23
          • 2013-04-25
          • 1970-01-01
          • 1970-01-01
          • 2012-08-17
          • 2021-05-25
          • 2011-01-11
          • 1970-01-01
          相关资源
          最近更新 更多