0

我遇到了以下具有我不理解的正则表达式的代码。

具体来说:

'#<!-- 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;
}

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

谢谢!

4

2 回答 2

3

您可以通过以下方式查看所有匹配项:

print_r($matches);

您可以在 regular-expressions.info 站点了解更多关于在 PHP 中捕获组的信息。

于 2013-08-12T21:01:58.590 回答
1

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

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

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

使用这样的输入:

嗨,我的名字是弗雷迪。

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

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

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

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

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

于 2013-08-12T21:12:20.600 回答