Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.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_Preg Match All_Preg Replace Callback - Fatal编程技术网

PHP正则表达式-匹配多种可能性(管道)

PHP正则表达式-匹配多种可能性(管道),php,regex,preg-match-all,preg-replace-callback,Php,Regex,Preg Match All,Preg Replace Callback,我想从文本中的几个URL获取所有ID(整数)。这些URL可能如下所示: http://url.tld/index.php/p1 http://url.tld/p2#abc http://url.tld/index.php/Page/3-xxx http://url.tld/Page/4 为此,我构建了两个正则表达式(URL由URL代码括起来): \[url\](http\://url\.tld/index\.php/p(\d+).*?\)[/url\] \[url\](http\://url\

我想从文本中的几个URL获取所有ID(整数)。这些URL可能如下所示:

http://url.tld/index.php/p1
http://url.tld/p2#abc
http://url.tld/index.php/Page/3-xxx
http://url.tld/Page/4
为此,我构建了两个正则表达式(URL由URL代码括起来):

\[url\](http\://url\.tld/index\.php/p(\d+).*?\)[/url\]
\[url\](http\://url\.tld(?:/index\.php)?/Page/(\d+).*?\)[/url\]
但是,如果我对每个正则表达式进行preg_match_all,我会得到一个如下的数组(这是正确的):

数组(3){
[0]=>
阵列(2){
[0]=>
字符串(62)“[url]http://url.tld/index.php/Page/6-fdgfh/[/url]”
[1]=>
字符串(50)“[url]http://url.tld/Page/7[/url]”
}
[1]=>
阵列(2){
[0]=>
字符串(51)”http://url.tld/index.php/Page/6-fdgfh/"
[1]=>
字符串(39)”http://url.tld/Page/7"
}
[2]=>
阵列(2){
[0]=>
字符串(1)“6”
[1]=>
字符串(1)“7”
}
}
但如果我将两个正则表达式与管道结合起来:

\[url\](http\://url\.tld/index\.php/p(\d+).*?;http\://url\.tld(?:/index\.php)?/Page/(\d+).*?\[/url\]
它构建的数组如下(这是错误的):

数组(4){
[0]=>
阵列(3){
[0]=>
字符串(71)“[url]http://url.tld/index.php/p9-abc#hashtag[/url]”
[1]=>
字符串(62)“[url]http://url.tld/index.php/Page/6-fdgfh/[/url]”
[2]=>
字符串(50)“[url]http://url.tld/Page/7[/url]”
}
[1]=>
阵列(3){
[0]=>
字符串(60)”http://url.tld/index.php/t9-abc#hashtag"
[1]=>
字符串(51)”http://url.tld/index.php/Page/6-fdgfh/"
[2]=>
字符串(39)”http://url.tld/Page/7"
}
[2]=>
阵列(3){
[0]=>
字符串(1)“9”
[1]=>
字符串(0)”
[2]=>
字符串(0)”
}
[3]=>
阵列(3){
[0]=>
字符串(0)”
[1]=>
字符串(1)“6”
[2]=>
字符串(1)“7”
}
}
====


所以,我的问题是:我如何解决这个问题?我需要的是第一个示例中的数组结构,同时使用两个正则表达式作为一个正则表达式,因为我需要一个一致的结构,以便稍后执行
preg\u replace\u回调。

我想您正在寻找:

\[url](|http://url\.tld/index\.php/p(\d+).*|http://url\.tld(?:index\.php)?/Page/(\d+).*?)\[/url]
或者,对于我们之间的线路噪音挑战:

\[url]
(
(?|
http://url\.tld/index\.php/p(\d+)[^[]*
|
http://url\.tld(?:index\.php)?/Page/(\d+)[^[]*
)
)
\[/url]

这将捕获第2组中的数字,无论正则表达式的哪个部分与之匹配。整个URL仍然捕获在第1组中。

平坦数组是否有帮助?(-具体请查看数组)这非常有效。非常感谢:)再问一个问题:如果我添加第三个模式会怎么样?这仍然有效还是需要进一步更改?没问题,只需添加另一个管道并在其之后粘贴新的正则表达式。请确保在分支重置组中,在关闭之前执行此操作。
。并确保新正则表达式只有一个捕获组。如果它有多个捕获组,会发生什么?别误会,我只是想在我再次问之前知道:D