【发布时间】:2017-09-17 04:23:14
【问题描述】:
我需要一些方法来捕获两组方括号之间的文本。 例如,下面的字符串:
test test [foo] bar [/foo] test
我需要输出“bar”,但“bar”是可变词
我怎样才能得到我需要的输出?
【问题讨论】:
我需要一些方法来捕获两组方括号之间的文本。 例如,下面的字符串:
test test [foo] bar [/foo] test
我需要输出“bar”,但“bar”是可变词
我怎样才能得到我需要的输出?
【问题讨论】:
preg_match('/\[([^\]]+)\](.*?)\[\/\1\]/', $text)
使用反向引用将第一个方括号标记与其结束标记匹配。请注意,如果您想允许嵌套相同的标签,或者将嵌套标签视为纯文本以外的任何内容,这将不起作用。
【讨论】:
也许用这个简单的表达方式:
preg_match('/\](.*)\[/', 'test test [foo] bar [/foo] test', $match);
echo trim($match[1]);
【讨论】:
我猜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> 或\g'name' 实现对命名子模式的反向引用。当可以嵌套相同类型的标签时要小心。想一想:
test
test
[foo][foo]bar[/foo][/foo]
test
那我们可能需要见Regular expression for nested tags (innermost to make it easier)。
【讨论】: