Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用preg_replace_回调为相同编号的子模式使用不同的名称_Php_Regex_Preg Replace Callback - Fatal编程技术网

Php 使用preg_replace_回调为相同编号的子模式使用不同的名称

Php 使用preg_replace_回调为相同编号的子模式使用不同的名称,php,regex,preg-replace-callback,Php,Regex,Preg Replace Callback,我很难弄清楚在我的regex子模式中到底有什么被编号。我被给予PHP警告: PHP警告:preg\u replace\u callback():编译失败:同一数字的子模式不允许有不同的名称 尝试以下操作时: $input = "A string that contains [link-ssec-34] and a [i]word[/i] here"; $matchLink = "\[link-ssec-(0?[1-9]|[1-9][0-9]|100)\]"; $matchItalic = "\[

我很难弄清楚在我的
regex
子模式中到底有什么被编号。我被给予
PHP
警告:

PHP警告:preg\u replace\u callback():编译失败:同一数字的子模式不允许有不同的名称

尝试以下操作时:

$input = "A string that contains [link-ssec-34] and a [i]word[/i] here";
$matchLink = "\[link-ssec-(0?[1-9]|[1-9][0-9]|100)\]";
$matchItalic = "\[i](.+)\[\/i]";
$output = preg_replace_callback(
    "/(?|(?<link>$matchLink)|(?<italic>$matchItalic))/",
    function($m) {
        if(isset($m['link'])){
            $matchedLink = substr($m['link'][0], 1, -1);
            //error_log('m is: ' . $matchedLink);
            $linkIDExplode = explode("-",$matchedLink);
            $linkHTML = createSubSectionLink($linkIDExplode[2]);
            return $linkHTML;
        } else if(isset($m['italic'])){
            // TO DO
        }

    },
    $input);
$matchLink = "\[link-ssec-(0?[1-9]|[1-9][0-9]|100)\]"; // matches [link-ssec-N]
$matchItalic = "\[i](.+)\[\/i]"; // matches [i]word[/i]
$output = preg_replace_callback(
        "/(?<link>$matchLink)|(?<italic>$matchItalic)/",
        function($m) { etc...
没有警告,我可以很好地获得匹配,但不能在函数中有条件地将它们作为目标。我相信我是按照正确的程序命名捕获组的,但是PHP说它们使用的是相同的子模式编号,这就是我不知道编号的地方。我熟悉使用
$1
$2
等来寻址子模式,但在与命名组一起使用时,我看不到它们之间的相关性


目标 如果我使用了完全错误的技术,我应该包括我的目标。我最初使用
preg\u replace\u callback()
替换匹配如下模式的标记字符串:

$output = preg_replace_callback(
    "/\[link-ssec-(0?[1-9]|[1-9][0-9]|100)\]/",
    function($m) {
        $matchedLink = substr($m[0], 1, -1);
        $linkIDExplode = explode("-",$matchedLink);
        $linkHTML = createSubSectionLink($linkIDExplode[2]);
        return $linkHTML;
    },
    $input);
这一需求已经发展到需要在同一段落中匹配多个标记(我最初的示例包括下一个
[i]word[/i]
。我不是从头开始为每个模式解析整个字符串,而是尝试在段落/字符串的一次扫描中查找所有模式,因为我相信这将减少系统负担。研究它使我相信在
分支重置中使用命名捕获组是能够目标与条件语句匹配。也许我用这一条走错了路,但如果能找到更好的方法,我会很感激的

期望的结果
$input=“此处包含[link-ssec-34]和[i]字[/i]的字符串”;
$output=“此处包含和一个单词的字符串。”

有可能根据需要添加更多的模式,以方括号的形式包含一个单词或是独立的。

但我没有完全理解我所做的(但现在将研究它)我在@BobbleBobble comment上做了一些尝试和错误,得到了以下结果以产生所需的结果。我现在可以使用针对命名捕获组的条件语句来决定对匹配项采取什么操作

我将
regex
更改为以下内容:

$input = "A string that contains [link-ssec-34] and a [i]word[/i] here";
$matchLink = "\[link-ssec-(0?[1-9]|[1-9][0-9]|100)\]";
$matchItalic = "\[i](.+)\[\/i]";
$output = preg_replace_callback(
    "/(?|(?<link>$matchLink)|(?<italic>$matchItalic))/",
    function($m) {
        if(isset($m['link'])){
            $matchedLink = substr($m['link'][0], 1, -1);
            //error_log('m is: ' . $matchedLink);
            $linkIDExplode = explode("-",$matchedLink);
            $linkHTML = createSubSectionLink($linkIDExplode[2]);
            return $linkHTML;
        } else if(isset($m['italic'])){
            // TO DO
        }

    },
    $input);
$matchLink = "\[link-ssec-(0?[1-9]|[1-9][0-9]|100)\]"; // matches [link-ssec-N]
$matchItalic = "\[i](.+)\[\/i]"; // matches [i]word[/i]
$output = preg_replace_callback(
        "/(?<link>$matchLink)|(?<italic>$matchItalic)/",
        function($m) { etc...
$matchLink=“\[link ssec-(0?[1-9]|[1-9][0-9]| 100)\]”;//匹配[link-ssec-N]
$matchItalic=“\[i](.+)\[\/i]”;//匹配[i]单词[/i]
$output=preg\u replace\u回调(
“/(?$matchLink)|(?$matchItalic)/”,
函数($m){等。。。

就开销而言,希望这也是一种将多个正则表达式模式与同一字符串中的回调进行匹配的有效方法。

我还没有完全理解我所做的工作(但现在将对此进行研究)我在@BobbleBobble comment上做了一些尝试和错误,得到了以下结果以产生所需的结果。我现在可以使用针对命名捕获组的条件语句来决定对匹配项采取什么操作

我将
regex
更改为以下内容:

$input = "A string that contains [link-ssec-34] and a [i]word[/i] here";
$matchLink = "\[link-ssec-(0?[1-9]|[1-9][0-9]|100)\]";
$matchItalic = "\[i](.+)\[\/i]";
$output = preg_replace_callback(
    "/(?|(?<link>$matchLink)|(?<italic>$matchItalic))/",
    function($m) {
        if(isset($m['link'])){
            $matchedLink = substr($m['link'][0], 1, -1);
            //error_log('m is: ' . $matchedLink);
            $linkIDExplode = explode("-",$matchedLink);
            $linkHTML = createSubSectionLink($linkIDExplode[2]);
            return $linkHTML;
        } else if(isset($m['italic'])){
            // TO DO
        }

    },
    $input);
$matchLink = "\[link-ssec-(0?[1-9]|[1-9][0-9]|100)\]"; // matches [link-ssec-N]
$matchItalic = "\[i](.+)\[\/i]"; // matches [i]word[/i]
$output = preg_replace_callback(
        "/(?<link>$matchLink)|(?<italic>$matchItalic)/",
        function($m) { etc...
$matchLink=“\[link ssec-(0?[1-9]|[1-9][0-9]| 100)\]”;//匹配[link-ssec-N]
$matchItalic=“\[i](.+)\[\/i]”;//匹配[i]单词[/i]
$output=preg\u replace\u回调(
“/(?$matchLink)|(?$matchItalic)/”,
函数($m){等。。。

就开销而言,希望这也是一种将多个正则表达式模式与同一字符串中的回调进行匹配的有效方法。

要回答有关警告的问题,请执行以下操作:

PHP警告:preg_replace_callback():编译失败:同一数字的子模式不允许使用不同的名称

您的模式定义了命名的匹配组。但是您的模式也使用了替换(
|
),这意味着模式的整个部分不需要作为全部匹配

这意味着,命名模式
链接
可以与匹配号
1
一起出现,但
斜体
也可以与匹配号1一起出现

由于存在替换,两个匹配项只能是相同的“编号”,因此它们只能具有相同的名称:

@(?|(?<first>one)|(?<first>two))@
@(?|(?一)|(?二))@
这是允许的

@(?|(?<first>one)|(?<second>two))@
@(?|(?一)|(?二))@

抛出此警告。

要回答有关警告的问题,请执行以下操作:

PHP警告:preg_replace_callback():编译失败:同一数字的子模式不允许使用不同的名称

您的模式定义了命名的匹配组。但是您的模式也使用了替换(
|
),这意味着模式的整个部分不需要作为全部匹配

这意味着,命名模式
链接
可以与匹配号
1
一起出现,但
斜体
也可以与匹配号1一起出现

由于存在替换,两个匹配项只能是相同的“编号”,因此它们只能具有相同的名称:

@(?|(?<first>one)|(?<first>two))@
@(?|(?一)|(?二))@
这是允许的

@(?|(?<first>one)|(?<second>two))@
@(?|(?一)|(?二))@

抛出此警告。

为什么要使用
(?:
非捕获组,或者在不需要时删除外部group。@bobblebubble我已在编辑中添加了我的理解clarity@biscuitstack您已经添加了您的目标,但您从未真正定义最终目标是什么(你基本上已经指出了你的最终过程和问题的前提,但不是最终结果)。你到底想用
[link ssec XX]
[i][i]做什么
pieces?您是否以某种方式编辑了原始字符串?如果是,输出类似于什么?@bitstack我想您的结果中有一个输入错误。您的意思是
word
?@ctwheels我的示例表明,我需要区分
[link ssec XX]
还是
[I]word[/I]
在(a)时是否匹配替换匹配的内容(b)需要回调来使用匹配模式的部分,a