Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/298.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正则表达式中具有相同名称的两个组_Php_Regex - Fatal编程技术网

php正则表达式中具有相同名称的两个组

php正则表达式中具有相同名称的两个组,php,regex,Php,Regex,我有一个输入,其中包含子字符串,格式为TXT number或number TXT。我想写regexp,它将匹配格式并只返回数字 我想出了这样的办法: $regex='/TXT(?[0-9]+)|(?[0-9]+)TXT/' 问题是,编译器说已经定义了名为number的组,即使中间有or运算符 在php中是否可以使用相同的名称编写两个组?如果不是,那么我如何编写这样的regexp 您可以使用(?|并在数字和文本之间添加空格 (?|TXT (?<number>[[0-9]+)|(?<

我有一个输入,其中包含子字符串,格式为
TXT number
number TXT
。我想写regexp,它将匹配格式并只返回数字

我想出了这样的办法:

$regex='/TXT(?[0-9]+)|(?[0-9]+)TXT/'

问题是,编译器说已经定义了名为
number
的组,即使中间有or运算符

在php中是否可以使用相同的名称编写两个组?如果不是,那么我如何编写这样的regexp

您可以使用
(?|
并在数字和文本之间添加空格

(?|TXT (?<number>[[0-9]+)|(?<number>[[0-9]+) TXT)

要使用相同的名称编写两个组,您需要使用
(?J)
内联标志:

'/(?J)TXT(?<number>[0-9]+)|(?<number>[0-9]+)TXT/'
请注意,在您的情况下,您不需要以下组:

'/TXT\K[0-9]+|[0-9]+(?=TXT)/'
环顾四周的人也会在这里做这项工作。

使用
(?J)
标志:
“/(?J)TXT(?[0-9]+)|(?[0-9]+)TXT/”
'/(?J)TXT(?<number>[0-9]+)|(?<number>[0-9]+)TXT/'
$regex = '/(?J)TXT(?<number>[0-9]+)|(?<number>[0-9]+)TXT/';
if (preg_match_all($regex, "TXT123 and 456TXT1", $matches, PREG_SET_ORDER, 0)) {
    foreach ($matches as $m) {
        echo $m["number"] . PHP_EOL;
    }
}
'/TXT\K[0-9]+|[0-9]+(?=TXT)/'