2012-01-19 51 views
0

我有一個網址, - 「http://example.com/sales/view/id/705」,我需要得到最後一個段(705)。如何使用PCRE獲取最後一段網址?

如何使用PCRE來做到這一點?

+0

使用PCRE是我的問題主要單詞。 – NiLL

+0

'$ pattern ='〜http://example.com/sales/view/id/([0-9] +)〜';'你可以擴展一點關於爲什麼你需要pcre解決方案嗎?我不懷疑它的需要..但你的答案可以顯着改變解決方案。 –

+0

我需要添加utm鏈接(分析)爲這個特殊的鏈接我使用preg_match與幾條規則。 – NiLL

回答

4

(在PHP)我不會用PCRE爲這樣的小事和未曖昧的工作。我只想做:

$parts = explode('/', rtrim($url, '/')); 
$partYouWant = array_pop($parts); 

編輯

如果你需要使用PCRE(雖然我不知道你爲什麼會)在尤金Ÿ的回答這種變化會做到這一點:

$pattern = '#/([^/]+)\z#'; 
$url = 'http://example.com/sales/view/id/705'; 
preg_match($pattern, $url, $matches); 
echo $matches[1]; 
6

這應該做它用Perl:

my ($last) = $url =~ /([^\/]+)\z/; 

但我寧願使用URI模塊:

my $last = (URI->new($url)->path_segments)[-1]; 
+3

如果URL有一個查詢或片段,則表明爲什麼使用[URI](http://search.cpan.org/perldoc?URI)是一種明智的方式,您的正則表達式可能會失敗。 +1提到模塊。 – ikegami

4

在PHP中,你可以在一個單一的代碼行做到這一點:

$url = 'http://example.com/sales/view/id/705'; 
substr($url, strrpos($url, '/') + 1); 
+0

+1 - 我懷疑這會降低我的解決方案的成本,並且會以相同的方式工作。這可能也需要'rtrim($ url,'/');'儘管我只是把這個放在可能有尾部斜線的URL中,這可能並非如此。 – DaveRandom

+0

@DaveRandom我認爲這也更快。正如你指出的那樣,在字符串結尾處可能無法使用'/',但似乎並不是這樣。無論如何,似乎有人不喜歡我的解決方案,由於-1 :) –

+3

我也有一個 - 但你能做什麼。至少它是downvoter代表downvote成本,而不是解釋。我認爲如果你投了第一個投票並且不對該文章發表評論,你就應該輸掉-5。 – DaveRandom

2

非PCRE替代:

$url="http://example.com/sales/view/id/705"; 
$lastPart = current(array_reverse((explode('/',parse_url($url,PHP_URL_PATH))))); 

懷疑這是任何更快雖然

+0

這很好,但我需要PCRE ... – NiLL

1

說不PCRE如果可以的話,:-)。

echo basename('http://example.com/sales/view/id/705'); 
+0

我不能這樣做=( – NiLL

2

您可以使用此模式([^\/]*)$一切從去年/結束。

也許也很有趣:([^\/\?]*)(\?.*)?$給你最後/和第一?

1

之間的一切最簡單的:

$ok=preg_match('#\d+$#',$url,$m); 
    if($ok) 
    echo $m[0],"\n"; 

聰明:

$ok=preg_match('#/(\d+)$#',$url,$m); 
    if($ok) 
    echo $m[1],"\n"; 

靈活:(因爲它也允許的話,其他比數位)

$ok=preg_match('#/(\w+)$#',$url,$m); 
    if($ok) 
    echo $m[1],"\n"; 

更靈活:(因爲它現在允許的一切,這不是一個/匹配)

$ok=preg_match('#/(.*?)$#',$url,$m); 
    if($ok) 
    echo $m[1],"\n"; 
1
preg_match('@/([1-9]\d*)/?(?:$|\?)@', $url, $matches);//$matches[1] contains your id