2016-09-14 66 views
3

從數據庫所以我要帶去的鏈接和那些看起來像這樣:正則表達式的preg_match工作不正常

www.website.com/games/randomcode1/RANDOM-URL-TITLE-NEEDED.html 
www.website.com/blabla/randomcode2/RANDOM-URL-TITLE-NEEDED2.htm 
www.website.com/whatever/randomcode2/RANDOM-URL-TITLE-NEEDED3.html 

在我的foreach循環URL被表示爲$row['links']; 什麼即時試圖做的是採取只隨機URL -Title極品。這意味着我需要從最後一個斜槓(在隨機代碼之後)直到URL結尾的url中的文本。 即時通訊使用此preg匹配功能,以採取我所需要的,但似乎我在開始(?)與regerx失敗。任何意見:

preg_match('#/(?:.*?).htm#is', $row['links'], $vardas); 
$vardas = $vardas[0]; 

回答

2

你居然匹配第一個/,然後任何1+字符到第一htm

我相信你需要

#/([^/]*)\.html?$#i 

regex demo

詳細

  • / - 字面/
  • ([^/]*) - 第1個捕獲0+煤焦比其他/
  • \. - 字面.
  • html? - htmlhtm
  • $ - 串的端

圖案的用於preg_filter的變化(如果你通過一個字符串數組):

$urls = array("www.website.com/games/RANDOM-URL-TITLE-NOT_NEEDED.xhtml", 
    "www.website.com/games/randomcode1/RANDOM-URL-TITLE-NEEDED.html", 
    "www.website.com/blabla/randomcode2/RANDOM-URL-TITLE-NEEDED2.htm", 
    "www.website.com/whatever/randomcode2/RANDOM-URL-TITLE-NEEDED3.html"); 

print_r(preg_filter('#^.*/(.*)\.html?$#i', '$1', $urls)); 

查看PHP demo,只有返回

[1] => RANDOM-URL-TITLE-NEEDED 
[2] => RANDOM-URL-TITLE-NEEDED2 
[3] => RANDOM-URL-TITLE-NEEDED3 

更新的正則表達式模式匹配:

  • ^ - 字符串的開始
  • .*/ - 除換行符以外的儘可能多的到最後的/ 0+字符和斜線本身
  • (.*) - 第1組捕獲儘可能多的除換行符之外的任何0+字符直到最後
  • \.html? - .htm.html子...
  • $ - 字符串的結尾。

$1是對捕獲到組1中的值的反向引用。

不使用正則表達式
+1

謝謝你這麼多的preg_filter!你是最好的! – DadaB

+0

我看到了,我添加了'preg_filter'中使用的更新正則表達式的解釋。 –

2

更優雅的方式:

echo pathinfo($url)['filename'];