我需要一些方法来捕获两组方括号之间的文本。 例如,以下字符串:
test test [foo] bar [/foo] test
我需要输出“bar”,但“bar”是一个变量词
如何获得我需要的输出?
答案 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)。