如何将这个正则表达式合二为一

时间:2012-08-10 22:59:58

标签: php regex

我正在尝试提取字符串的最后一个单词但忽略它可能具有的任何扩展名 例如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

4 个答案:

答案 0 :(得分: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 是我一直使用的东西 - 非常方便。

答案 1 :(得分: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, '.'));

答案 2 :(得分:1)

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

答案 3 :(得分:0)

非贪婪搜索加上扩展名上的可选匹配应该可以解决问题:

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