2016-04-24 70 views
0

我有URL結構從例如:PHP:未定義抵消:3 - preg_match_all

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>";} 

想法我缺少什麼?我想結束斜槓/是我的正則表達式中的問題。

任何想法?謝謝!

+0

使用'var_dump'看你真正有'$比賽'。 http://php.net/var_dump –

+0

array(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] => array(3){[0] => string(12) 「some-text-a1」[1] => string(11)「sec-text-b2」[2] => string(10)「third-text」}} – Fritex

+0

看,你沒有第三個元素。 –

回答

1

試試這個

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

Regex demo

說明:
(?<=…):正回顧後sample
(…):捕獲組sample
.:除了行中的任何字符打破sample
*:零次或多次sample
?:一旦或無sample
(?=…):正向前查找sample
|:輪換/ OR操作數sample
\:轉義特殊字符sample
[^x]:一個字符不是x sample
$:字符串或行結束的結束取決於多模式sample

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 
) 
+0

謝謝!讓它像魅力一樣工作! – Fritex

1

這是一種不同的方法 - 使用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); 
     } 
} 
+0

'parse_url'具有第二個參數,僅以字符串的形式獲取您感興趣的部分。 –

+0

感謝與爆炸()功能的想法! – Fritex