2012-08-10 169 views
0

我想提取一个字符串的最后一个单词,但忽略它可能有的任何扩展名 例如amazon_uk代替amazon_uk.gif如何结合这个正则表达式到一个

下面的代码提取使用2个的preg_match功能,我希望能够做同样的事情在1周的preg_match字符串的话,我该怎么办呢?

PHP代码

$str = 'http://i.example.com/about/bs/logo_borderless/amazon_uk.gif'; 

preg_match('/[^\.\/]+\.[^\.\/]+$/', $str, $matches); 
preg_match('/^[^.]+(?=.)/', $matches[0], $matches2); 
$website = $matches2[0]; 

输出

amazon_uk 
+0

是它始终将是该格式(即URI)? – PeeHaa 2012-08-10 23:01:51

+0

@Petra yes always – 2012-08-10 23:02:28

+0

在这些情况下使用'parse_url()'有些东西需要说明,至少要做第一遍解析。 – 2012-08-10 23:05:56

回答

3
preg_match('#/([^./]+)\.[^./]+$#si', $str, $matches); 

下面是它在做什么...

/ 

匹配正斜杠

([^./]+) 

然后一个或多个既不是周期或正斜杠的。这是我们匹配的一点。

\. 

然后过一段

[^./]+ 

然后一个或多个既不是周期或斜线再次的。

$ 

然后串


结束时,你问一个正则表达式,所以这上面。但这里是我真正做...

$url = 'http://i.example.com/about/bs/logo_borderless/amazon_uk.gif'; 
$output = str_replace(array('.gif','.jpg','.png'), '', basename($url)); 

Basename的东西,我用所有的时间 - 非常方便。

+0

我不明白这是什么... – 2012-08-10 23:04:44

+0

这不就是你问这个问题的原因吗? – 2012-08-10 23:05:44

+1

正确,但这不工作... http://regexr.com?31q7f – 2012-08-10 23:07:15

1
preg_match('/\/([\w]+)\.(?:[a-zA-Z]{1,3})$/', $str, $matches); 
$result = $matches[1]; 
+0

不完全是我想要的,我想在最后一个正斜杠之后和.gif扩展之前得到这个字符串这个返回是什么?/ amazon_uk.gif' – 2012-08-10 23:11:43

+0

它返回* amazon_uk *为我。 尝试忽略第二行并查看'var_dump($ matches)' – 2012-08-10 23:14:09

2

因为它总是会在你指定的(每评论)的格式,你也可以用substr()strpos()(和strrpos())的组合来获取文本,而不是正则表达式:

// get the filename after the last slash 
$file = substr($str, strrpos($str, '/') + 1); 
// get the text before the extension 
$website = substr($file, 0, strpos($file, '.')); 
0

非贪婪搜索再加上扩展可选的比赛应该做的伎俩:

preg_match('/([^\.\/]+?)(?:\.\w*)?$/', $str, $matches); 
$website = $matches[1];