在PHP中捕获两组方括号之间的文本

时间:2017-09-17 04:23:14

标签: php regex

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

test test [foo] bar [/foo] test

我需要输出“bar”,但“bar”是一个变量词

如何获得我需要的输出?

3 个答案:

答案 0 :(得分:1)

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

使用反向引用将第一个方括号标记与其结束标记相匹配。请注意,如果您希望允许嵌套相同的标记,或者将嵌套标记视为纯文本以外的其他标记,则不会起作用。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

如果您关心标签的完全匹配,我想 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<name>pattern) 来命名子模式。然后,这个子模式将在匹配数组中按其正常数字位置和名称进行索引。有两种替代语法 (?<name>pattern)(?'name'pattern)
  • 对命名子模式的反向引用可以通过 (?P=name)\k<name>\k'name'\k{name}\g{name}\g<name> 或 { {1}}。

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

\g'name'

然后我们可能需要看到Regular expression for nested tags (innermost to make it easier)