2013-10-10 52 views
0

我在一個變量$ url中存儲了一個URL。 $ URL可以是:PHP使用正則表達式從url中提取部分

/panel 
/panel/<pages> 
/panel/<XX> 
/panel/<XX>/<pages> 

其中:

panel is a fixed string 
<pages> is an aribtary string 
<XX> is a number (1 to infinite digits) 

我怎麼能爆炸,使用PHP的正則表達式走出$號(如果存在)和$頁面(如果存在的話)?

+3

你能發表你試過的嗎?它將幫助我們評估您需要學習的內容,而不僅僅是給你答案。 –

+2

爲什麼你需要正則表達式?正如你所提到的,你可以[分解](http://php.net/manual/en/function.explode.php)分隔符'/'來分別檢查每個部分。正則表達式在這裏是一個矯枉過正的事情。 – viraptor

+1

「我怎樣才能爆炸出去$數字(如果存在)...」*有趣的事實:*你通常不能爆炸,然後出去:) –

回答

1

你可以使用:^/panel(?:/(\d*)/?(\w*)/?)?$

$strs = array(
    '/panel' 
    ,'/panel/pages' 
    ,'/panel/69' 
    ,'/panel/69/pages' 
); 
foreach($strs as $str) 
{ 
    preg_match('#^/panel(?:/(\d*)/?(\w*)/?)?$#',$str,$matches); 
    list($orig,$number,$pages) = array_pad($matches,3,false); 
    echo "<pre>"; 
    print_r(compact('orig','number','pages')); 
    echo "</pre>"; 
} 
/* OUTPUT: 

Array 
(
    [orig] => /panel 
    [number] => 
    [pages] => 
) 

Array 
(
    [orig] => /panel/pages 
    [number] => 
    [pages] => pages 
) 

Array 
(
    [orig] => /panel/69 
    [number] => 69 
    [pages] => 
) 

Array 
(
    [orig] => /panel/69/pages 
    [number] => 69 
    [pages] => pages 
) 

*/ 
+0

太棒了,謝謝。 – Alvins

+0

不希望匹配'/ panel/pages/69'而不是'/ panel/69/pages'? – Broxzier

+0

@Broxzier在他們的帖子頂部寫道:「/ panel//'在第一個代碼塊的底部,所以沒有 – SmokeyPHP

0

我認爲像這樣可以工作:

 
$url = "/panel/33/asdasd-asdasd"; 

preg_match('/\/panel\/?([^\/]*)\/?([^\/]*)/i', $url, $matches); 

print_r($matches); 

基本上表現之後?或*只會匹配,如果它們存在

1
^/panel(/[a-zA-Z]+)?(/\d+)?$ 

匹配:

/panel 
/panel/23 
/panel/apple 
/panel/apple/1234 

不匹配:

/panel/ 
/panel/23/apple 
/panel/apple/123/12 
/panel/apple/pear 

Regular expression visualization

此正則表達式簡單的返回true如果有一場比賽,如果不是,則爲false。有很多關於如何使用PHP正則表達式的教程,以及如何從中獲得你想要的部分。在這種情況下,$1將保存頁面名稱,並且$2將保存頁碼。

+0

你用什麼工具繪製正則表達式? – SAnDAnGE

+0

@SAnDAnGE https://www.debuggex.com/r/GtWGLRuEmiRyv5Ga – Broxzier

0

從問題中可以看出,只需要找出網址中的第二個分段,以防分段爲數字。

所以,你可以這樣做:

找出第二段 - >檢查它是否一個數字 - >如果您的測試是肯定的(即它是一個數字) - >您已經獲得你想要什麼。

0

新來的正則表達式,但試試這個:

$urls = array(); 
$urls[] = "/panel"; 
$urls[] = "/panel/something"; 
$urls[] = "/panel/12"; 
$urls[] = "/panel/42/something else"; 

foreach($urls as $url) 
{ 
    echo "evaluating: '$url'"; 
    preg_match("|/panel(?:/)?([0-9]*)?(?:/)?(.*)?|",$url,$matches); 
    echo "<pre>"; 
    var_dump($matches); 
    echo "</pre>"; 
} 
0

Demo

function parsePath($url) { 
    $number = NAN; 
    $page = ''; 
    $found_number = false; 
    $found_page = false; 

    $parsed = parse_url($url); 
    $pathArr = []; 

    if (isset($parsed['path'])) 
    $pathArr = explode('/', $parsed['path']); 

    foreach ($pathArr as $path) { 
    if (is_numeric($path) && !$found_number) { 
     $number = $path; 
     $found_number = true; 
     continue; 
    } 
    if (!empty($path) && preg_match('/[^(panel)]/', $path) && !$found_page) { 
     $page = $path; 
     $found_page = true; 
     continue; 
    } 
    } 
    echo "Parsed Url = { Number: $number, Page: '$page' }\n"; 
} 

parsePath('http://www.google.com/panel/123/page1'); 
parsePath('http://www.google.com/panel/page1/123'); 
parsePath('http://www.google.com/panel/123'); 
parsePath('http://www.google.com/panel/page1'); 
parsePath('http://www.google.com'); 

結果:

Parsed Url = { Number: 123, Page: 'page1' } 
Parsed Url = { Number: 123, Page: 'page1' } 
Parsed Url = { Number: 123, Page: '' } 
Parsed Url = { Number: NAN, Page: 'page1' } 
Parsed Url = { Number: NAN, Page: '' }