3

可能重复:
如何在 PHP 中将 ereg 表达式转换为 preg?

我正在编写一个 PHP 脚本。

我有一个形式的 URL:

http://ecx.images-amazon.com/images/I/5104Xl51zFL._SL175_.jpg

我只是想抓住文件名的第一部分5104Xl51zFL

我对正则表达式很陌生,但到目前为止我有:

.*images\/I\/(.+?)(\.[^.]*|$)

根据 regextester.com 应该可以工作,但在我的 PHP 中没有。

如果它不是最佳解决方案,则不必是正则表达式。

如果它是相关的,这是我的 PHP(仍然是调试的):

function linkExtractor($html)
{
    if(preg_match_all('/<img ([^>]* )?src=[\"\']([^\"\']*\._SL175_\.jpe?g)[\"\']/Ui', $html, $matches, PREG_SET_ORDER)){
        foreach ($matches as $match) {
            $url = $match[2];
            echo "\n\n" .$url . "\nfile name: ";
            if(preg_match_all('.*images\/I\/(.+?)(\.[^.]*|$)', $url, $matched, PREG_SET_ORDER)) {
                foreach($matched as $name) {
                    print_r($matched);
                }
            }
        }
    }
}
4

5 回答 5

8
$url = 'http://ecx.images-amazon.com/images/I/5104Xl51zFL._SL175_.jpg';
$path = parse_url($url, PHP_URL_PATH);
$filename = basename($path);
$partOne = strtok($filename, '.');
于 2012-11-23T23:04:17.007 回答
1

这将匹配 和 之间/images/I/的所有内容.

$url = 'http://ecx.images-amazon.com/images/I/5104Xl51zFL._SL175_.jpg';
if(preg_match('~/images/I/(.+?)\.~',$url,$match)) {
    $name = $match[1];
}
于 2012-11-23T23:08:26.690 回答
1

一种使用方式regex

$str='http://ecx.images-amazon.com/images/I/5104Xl51zFL._SL175_.jpg';
preg_match('/.*\/(.*?)\./',$str,$match);
print $match[1];

>>> 5104Xl51zFL

解释:

.*    # Match anything
\/    # Up to the last forwardslash (escaped)
(.*?) # Match anything after (captured, lazy)
\.    # Up to the first . (escaped)
于 2012-11-23T23:09:45.860 回答
1

如果您仍在寻找一个正则表达式来提取文件名的那部分,这里是一个:

([^/.]++)[^/]+$

此表达式将匹配完整的文件名。捕获组 1 将包含文件名中第一个点之前的每个字符。

++ 使这个正则表达式比只有一个 + 更快。这是因为当一段文本匹配失败时,正则表达式会更快地失败。

于 2012-11-23T23:09:50.887 回答
0
$file = basename("http://ecx.images-amazon.com/images/I/5104Xl51zFL._SL175_.jpg");
echo substr($file, 0, strpos($file, "."));

strpos比对简单的事情使用正则表达式要快得多

于 2012-11-23T23:07:30.717 回答