PHP:未定义的偏移量:3-预匹配

PHP:未定义的偏移量:3-预匹配,php,regex,url,Php,Regex,Url,我使用示例中的URL结构: 我的正则表达式是: 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 lin

我使用示例中的URL结构:

我的正则表达式是:

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>";}
$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=“第三个文本”;
$cetvrti=“last-text-c1”;
回显“URL:.$html.”
“; 如果($prvi==$matches[1][0]){echo“1st O.K.-”$prvi.=“$matches[1][0]”。“
”;} 如果($drugi==$matches[1][1]){echo“第二个OK.-”$drugi.=“$matches[1][1]。”
“;} 如果($treci==$matches[1][2]){echo“第三个OK.-”$treci.=“$matches[1][2]。”
“;} 如果($cetvrti==$matches[1][3]){echo“4th O.K.-”$cetvrti.=“$matches[1][3]。”
”;}
我错过了什么?我想结尾的斜杠/是我的正则表达式中的问题


有什么想法吗?谢谢

这是一种不同的方法-使用parse_urlexplode函数

<?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);
        }
}

这是一种不同的方法-使用parse_urlexplode函数

<?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);
        }
}
试试这个

(?<=vs-)(.*?)(?=-vs)|(?<=\/)([^\/]*?)(?=-vs)|(?<=vs-)(.*?)(?=\/|$)
输出:

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

(?<=vs-)(.*?)(?=-vs)|(?<=\/)([^\/]*?)(?=-vs)|(?<=vs-)(.*?)(?=\/|$)
输出:

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

使用
var\u dump
查看
$matches
中的实际内容。数组(2){[0]=>array(3){[0]=>string(16)“some-text-a1-vs-”[1]=>string(15)“sec-text-b2-vs-”[2]=>string(14)“third text-vs-”}[1]=>string(12)“some-text-a1”[1]=>string(11)“sec-text-b2”[2]=>string(10)“third text”}书写错误或预期错误。表达式中的
\w+
应该匹配什么?它会导致URL的最后一部分完全不匹配。
匹配尾随斜杠(尽管不应转义它),然后表达式要求在行尾之前至少有一个字字符,因为行尾已经到达,所以没有字字符。是的,regex是错误的。使用
var\u dump
查看
$matches
中的实际内容。数组(2){[0]=>array(3){[0]=>string(16)“some-text-a1-vs-”[1]=>string(15)“sec-text-b2-vs-”[2]=>string(14)“third text-vs-”}[1]=>string(12)“some-text-a1”[1]=>string(11)“sec-text-b2”[2]=>string(10)“third text”}书写错误或预期错误。表达式中的
\w+
应该匹配什么?它会导致URL的最后一部分完全不匹配。
匹配尾随斜杠(尽管不应转义它),然后表达式要求在行尾之前至少有一个字字符,因为行尾已经到达,所以没有字字符。是的,regex是错误的
parse_url
还有第二个参数,用于仅获取您感兴趣的部分作为字符串。感谢您使用explode()函数的想法
parse_url
还有第二个参数,用于仅获取您感兴趣的部分作为字符串。感谢您使用explode()函数的想法!