带有子表达式的正则表达式

时间:2013-08-12 20:59:59

标签: php regex

我遇到了以下代码,其中包含一个我不理解的正则表达式。

具体做法是:

'#<!-- START '. $tag . ' -->(.+?)<!-- END '. $tag . ' -->#si'

PHP表示函数'preg_match'将返回以下内容:

  

“如果提供了匹配,那么它将填充结果   搜索。 $ matches [0]将包含与完整匹配的文本   模式,$ matches [1]将具有与第一个匹配的文本   捕获带括号的子模式,依此类推。 “

我认为

(.+?)

是一个'带括号的子模式'。我在哪里可以阅读关于子模式的内容?一个与w3schools.com不同的官方地方。

/**
 * Gets a chunk of page content
 * @param String the tag wrapping the block ( <!-- START tag --> block <!-- END tag --> )
 * @return String the block of content
 */
public function getBlock( $tag )
{
    preg_match ('#<!-- START '. $tag . ' -->(.+?)<!-- END '. $tag . ' -->#si', $this->content, $tor);

    $tor = str_replace ('<!-- START '. $tag . ' -->', "", $tor[0]);
    $tor = str_replace ('<!-- END '  . $tag . ' -->', "", $tor);

    return $tor;
}

任何解释和链接都会有所帮助!

谢谢!

2 个答案:

答案 0 :(得分:3)

你可以通过类似的东西看到所有的比赛:

print_r($matches);

你可以learn more about capturing groups in PHP here at the regular-expressions.info site.

答案 1 :(得分:1)

这是关于子模式的PHP手册:http://php.net/manual/en/regexp.reference.subpatterns.php

子模式让你做一些事情。当模式匹配时,您将获得整个匹配的值,以及每个子模式的值。在这样一个非常简单的正则表达式的情况下:

  

嗨,我的名字是(\ w *)\。

输入如下:

  

嗨,我的名字是弗雷迪。

您的匹配结果是一个包含Hi, my name is Freddie.Freddie的数组。

子模式还可以帮助您定义正则表达式。如果我们改变前面的例子......

  

嗨,我的名字是(Fred | Shaggy)\。

如果给出的名字是Freddie或Shaggy,你的正则表达式只会匹配该句子。您可以在其中加载其他各种模式以匹配。阅读我提供的链接,这是很多解释(并且他们做得比我更好)。

最后的注释 - 有时你想要捕获子模式结果;有时你只是想用它来匹配整体模式。有时你想要两者。