【问题标题】:PHP regex to extract first part of file name in URL [duplicate]PHP正则表达式提取URL中文件名的第一部分[重复]
【发布时间】:2012-11-12 06:21:22
【问题描述】:

可能重复:
How can I convert ereg expressions to preg in PHP?

我正在编写一个 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);
                }
            }
        }
    }
}

【问题讨论】:

    标签: php regex extract filenames


    【解决方案1】:
    $url = 'http://ecx.images-amazon.com/images/I/5104Xl51zFL._SL175_.jpg';
    $path = parse_url($url, PHP_URL_PATH);
    $filename = basename($path);
    $partOne = strtok($filename, '.');
    

    【讨论】:

    • 完美——一直在寻找一种无需正则表达式的方法
    • 那不是给你“com/images/I/5104Xl51zFL”而不是“5104Xl51zFL”吗?
    • 哦,我明白我错了。
    【解决方案2】:
    $file = basename("http://ecx.images-amazon.com/images/I/5104Xl51zFL._SL175_.jpg");
    echo substr($file, 0, strpos($file, "."));
    

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

    【讨论】:

      【解决方案3】:

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

      $url = 'http://ecx.images-amazon.com/images/I/5104Xl51zFL._SL175_.jpg';
      if(preg_match('~/images/I/(.+?)\.~',$url,$match)) {
          $name = $match[1];
      }
      

      【讨论】:

        【解决方案4】:

        一种使用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)
        

        【讨论】:

          【解决方案5】:

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

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

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-09-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-11-04
            • 1970-01-01
            • 2011-05-15
            相关资源
            最近更新 更多