2016-09-14 112 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'];