PHP正则表达式,包含其限定符作为引用

PHP正则表达式,包含其限定符作为引用,php,regex,expression,Php,Regex,Expression,我有这个字符串: {include="folder/file" vars="key:value"} 我有一个正则表达式来捕获文件和变量,如下所示: |\{include\=[\'\"](.*)\/(.*)[\'\"](.*)\}|U First (.*) = folder Second (.*) = file Third (.*) = params (and I have some functions to parse it) 但在某些情况下,我需要捕获参数,其中包含括号{}。像这样: {

我有这个字符串:

{include="folder/file" vars="key:value"}
我有一个正则表达式来捕获文件和变量,如下所示:

|\{include\=[\'\"](.*)\/(.*)[\'\"](.*)\}|U

First (.*) = folder
Second (.*) = file
Third (.*) = params (and I have some functions to parse it)
但在某些情况下,我需要捕获参数,其中包含括号{}。像这样:

{include="file" vars="key:{value}"}
{include="file" vars="key:{value}
regext正在工作,但它仅在第一个结束括号之前捕获结果。像这样:

{include="file" vars="key:{value}"}
{include="file" vars="key:{value}
因此,代码的某些部分仍然存在

我如何才能使这些括号成为结果的一部分,而不是作为关闭限制器


谢谢

您可以使用此正则表达式:

\{include=['"](?:(.*)\/(.*?)|(\w+))['"] vars="(.*?)"\}

记住@naomik说的话,我想我应该改变我的正则表达式。 我现在要做的是检测这个结构:

{word="value" word="value" ... n times}
我有这个正则表达式:\w+=['].*?[']

它检测到:

{include="folder/file"}
{include="folder/file" vars="key:value"}
{vars="key:{value}" include="folder/file"}  (order changed)
它工作得很好,但我不知道如何将初始和最终括号添加到正则表达式中。当我添加它们时,它不再像我想要的那样工作了


另一个涵盖第一个问题的强大regexp:

preg_match_all("{include=[\"']{1}([^\"']+)[\"']{1} vars=[\"']{1}([^\"]+)[\"']{1}}", $str, $matches);
您将在$matches中获得此类结果:

Array
(
    [0] => Array
        (
            [0] => {include="folder/file" vars="key:{value}"}
            [1] => {include="folder/file" vars="key:value"}
            [2] => {include="folder/file" vars="key:value"}
            [3] => {include="file" vars="key:{value}"}
        )

    [1] => Array
        (
            [0] => folder/file
            [1] => folder/file
            [2] => folder/file
            [3] => file
        )

    [2] => Array
        (
            [0] => key:{value}
            [1] => key:value
            [2] => key:value
            [3] => key:{value}
        )
)
您可以通过这种方式访问重要内容:第一个元素为$matches[1][0]和$matches[2][0],第二个元素为$matches[1][1]$matches[2][1],等等

它不会将文件夹或文件存储在单独的结果中。为此,您必须编写一个子代码。编写同时包含include=folder/file和include=file的正则表达式没有一种优雅的方法

它不支持include和vars的反转。如果您希望支持此功能,则必须将输入数据逐行分割成块,或在大括号之间分割成文本,然后才能尝试将内容与以下内容进行匹配:

preg_match_all("([\w]+)=[\"']{1}([^\"']+)[\"']{1}", $chunk, $matches);
然后匹配将包含如下内容:

Array
(
    [0] => Array
        (
            [0] => vars="key:{value}"
            [1] => include="folder/file"
        )

    [1] => Array
        (
            [0] => vars
            [1] => include
        )

    [2] => Array
        (
            [0] => key:{value}
            [1] => folder/file
        )
)

然后您知道$matches[1][0]包含“vars”,您可以在$matches[2][0]中获取vars值。对于$matches[1][1],它包含“include”,然后您可以在$matches[2][1]中获取“folder/file”。

您的最后一次匹配是为。*任何内容,但不包括ungreedy;并在尽可能早的时间点终止。它不断言vars=或引用的部分。是的,我知道。在某些情况下,第三个匹配项将只有一个字符串,在其他情况下,它将有一个带有key/value的param,如示例中所示,但在任何情况下,它都可能包含一个{value}使用括号,所以我需要正则表达式允许第三个匹配中的括号。您引入的主要复杂性是试图在一个正则表达式中拆分文件夹/文件。相反,请重复optionalized\w+=[^]+?:\h | \}以首先拆分键值对。