PHP:未定义的偏移量:3 - preg_match_all


PHP: Undefined offset: 3 - preg_match_all

我有来自示例的URL结构:

http://www.example.com/directory/some-text-a1-vs-sec-text-b2-vs-third-text-vs-last-text-c1/

我的正则表达式是:

preg_match_all("/([^'/.]+?)(?:-vs-|'.'w+$)/", $html, $matches);

预期成果:

some-text-a1
sec-text-b2
third-text
last-text-c1

我得到的结果:

some-text-a1
sec-text-b2
third-text
Notice: Undefined offset: 3 in F:'xampp'htdocs'url.php on line 41

完整代码:

$html = "http://www.example.com/directory/some-text-a1-vs-sec-text-b2-vs-third-text-vs-last-text-c1/";
preg_match_all("/([^'/.]+?)(?:-vs-|'.'w+$)/", $html, $matches);
$prvi = "some-text-a1";
$drugi = "sec-text-b2";
$treci = "third-text";
$cetvrti = "last-text-c1";
echo "URL: ".$html."<br>";
if($prvi == $matches[1][0]){echo "1st O.K. - ".$prvi." = ".$matches[1][0]."<br>";}
if($drugi == $matches[1][1]){echo "2nd O.K. - ".$drugi." = ".$matches[1][1]."<br>";}
if($treci == $matches[1][2]){echo "3rd O.K. - ".$treci." = ".$matches[1][2]."<br>";}
if($cetvrti == $matches[1][3]){echo "4th O.K. - ".$cetvrti." = ".$matches[1][3]."<br>";}

想法 我错过了什么?我想结尾斜杠/是我的正则表达式中的问题。

有什么想法吗?谢谢!

试试这个

(?<=vs-)(.*?)(?=-vs)|(?<='/)([^'/]*?)(?=-vs)|(?<=vs-)(.*?)(?='/|$)

正则表达式演示

解释:
(?<=…):正面回视样本
( … ):捕获组样本
.:除换行符示例
以外的任何字符 *:零倍或更多次采样
? : 一次或无样品
(?=…):正面前瞻样本
| : 交替/OR操作数样本
':转义特殊字符示例
[^x]:一个不是 x 样本
的字符 $:字符串结束或行尾,具体取决于多行模式示例

.PHP:

<?php
$re = "/(?<=vs-)(.*?)(?=-vs)|(?<=''/)([^''/]*?)(?=-vs)|(?<=vs-)(.*?)(?=''/|$)/"$
$str = "http://www.example.com/directory/some-text-a1-vs-sec-text-b2-vs-third-t$
preg_match_all($re, $str, $matches);
print_r($matches[0]);

输出:

Array
(
    [0] => some-text-a1
    [1] => sec-text-b2
    [2] => third-text
    [3] => last-text-c1
)
这是一种

不同的方法 - 使用parse_url分解函数。

<?php
$url = 'http://www.example.com/directory/some-text-a1-vs-sec-text-b2-vs-third-text-vs-last-text-c1/';
$parsedUrl = parse_url($url);
var_dump($parsedUrl);
$path = explode('/',trim($parsedUrl['path'],'/'));
var_dump($path);
if (is_array($path) && $path[0] === 'directory') {
        if (isset($path[1])) {
                $vs = explode('-vs-',$path[1]);
                var_dump($vs);
        }
}