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
4

4 回答 4

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是我一直使用的东西 - 非常方便。

于 2012-08-10T23:03:32.000 回答
2

因为它将始终采用您指定的格式(根据评论),您还可以使用substr()and strpos()(and 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, '.'));
于 2012-08-10T23:07:47.413 回答
1
preg_match('/\/([\w]+)\.(?:[a-zA-Z]{1,3})$/', $str, $matches);
$result = $matches[1];
于 2012-08-10T23:07:40.447 回答
0

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

preg_match('/([^\.\/]+?)(?:\.\w*)?$/', $str, $matches);
$website = $matches[1];
于 2012-08-11T00:59:09.643 回答