2013-08-21 167 views
4

我的目標:PHP正則表達式有或沒有結尾的斜槓

要捕捉URL是否存在或不是結尾的斜線,沒有結尾的斜線是字符串的一個部分的最後一部分類似一個URL如下:

http://foo.com/p/dPWjiVtX-C/ 
       ^^^^^^^^^^ 
       The string I want 

我的問題:

每一個辦法,我只能嘗試允許尾隨斜線而不是一個URL沒有尾隨斜線或使線索斜槓包含在我想要的字符串中。

我試過了什麼?

我試圖斜線添加到末尾:

$regex = "/.*?foo\.com\/p\/(.*)\//"; 
    if ($c=preg_match_all ($regex, $url, $matches)) 
    { 
    $id=$matches[1][0]; 
    print "ID: $id \n"; 
    } 

這將導致錯誤,當我沒有結尾的斜線。

2. 我已嘗試添加一個問號:

$regex = "/.*?foo\.com\/p\/(.*)[\/]?/"; 

這導致斜線,如果存在,是我的字符串中。

我的問題/ TL;博士:

如何建立一個正則表達式不需要斜線,但保持斜線出我前面的字符串?

+1

順便說一句,爲什麼不使用爆炸( 「/」,$網址)?您可以提取應該作爲目標的數組的最後一個值。 – palerdot

+0

我需要驗證它是否爲該網站的正確網址 – Pachonk

+0

您仍然可以檢查尾部斜線並根據您的需要追加(或刪除)它。 – palerdot

回答

9

.*是默認的貪婪,所以如果能在捕獲中「吃」的斜槓它會的。

爲了不貪婪,您需要.*?代替您的捕獲組中的.*。所以,你的正則表達式是:

$regex = "/^.*?instagram\.com\/p\/(.*?)[\/]?$/"; 
+0

似乎非貪婪問號強制我的RegEx根本無法獲取我的ID。 – Pachonk

+0

啊,是的,我的錯誤。我已編輯添加開始和結束字符。 – vroomfondel

+0

這似乎是解決這個問題的最實際的解決方案。不過,你確實把^和$放在了斜線之外。 – Pachonk

2

您可以使用此捕獲所有字符,除了你的團隊在後面的斜線:

$regex = "/.*?instagram\.com\/p\/([^\/]*)/" 

或者,你可以在你的小組使用一個非貪婪量詞,你必須指定一個尾部以斜線或字符串的結尾(或一些其他終止)爲集團捕捉到你的ID:

$regex = "/.*?instagram\.com\/p\/(.*?)(?:\/|$)/" 
2

有些事情,你可以嘗試也許是:

([^\/]+)\/?$ 

Demo on regex101

編輯:咦,你應該提到你需要檢查的部位爲好,因爲你把foo.com放在你的第一個例子字符串中(並且在那之後重新編輯你的問題...)。

你可以用這個來代替檢查部位:

^.*foo\.com.*?([^\/]+)\/?$ 
相關問題