正则表达式最适合这个问题吗?

时间:2011-04-18 00:45:34

标签: php regex

我需要这样的网址:

  

https://www.domain.com/m/281/ [imagename] .jpg文件

并将其转换为:

  

http://www.NEWdomain.com/images/ [imagename] .jpg文件

我需要对很多网址执行此操作,因此我想编写一个快速的php脚本,将网址放入数组,然后循环更改域名并删除原始网址中的文件结构。并非所有原始网址都是/m/281,但有些网址略有不同。

我认为我可以为str_replacehttps://www.domain.com执行http://www.NEWdomain.com,但我对如何将网址中的变化/m/281/更改为我的文件结构感到困惑比如/images/

正则表达式最好能解决这个问题吗?

6 个答案:

答案 0 :(得分:3)

你可以尝试类似的东西:

  1. 剥离“https://”
  2. 按照你的说法做一个str_replace() 域名
  3. 将字符串拆分为基于数组 上 ”/”。 explode("/", $urlString);
  4. 循环并删除任何元素 在URL元素之后但不是 最后。
  5. 结果将是:

    $arr[0] = www.NEWdomain.com
    $arr[1] = [imagename].jpg
    

    然后在最后一个元素“images”之前插入

    结果将是:

    $arr[0] = www.NEWdomain.com
    $arr[1] = images
    $arr[2] = [imagename].jpg
    

    最终将其重新打包回字符串:

    $blah = implode("/", $arr);
    

答案 1 :(得分:2)

为什么不尝试使用某些网址解析库,例如 - parse_url

然后获取每个组件并执行更简单的字符串替换。

答案 2 :(得分:1)

如果您想要更改所有路径中的所有图像网址,则此测试功能应该可以解决问题。

function fixurls($text) {
    $re = '% # Match image urls in domain.com
        https://www\.domain\.com/ # Required domain.
        (?:[^\s/]+/)*             # Optional pathname.
        ([^\s/]+\.jpe?g|png|gif)  # $1: Filename (images only)
        \b                        # Anchor to word boundary.
        %xim';
    // Fix all image URLs in $text string.
    $replace = 'http://www.NEWdomain.com/images/$1';
    $text = preg_replace($re, $replace, $text);
    return $text;
}

如果您只想更改特定路径中的图像,则可以轻松修改正则表达式的路径部分。

答案 3 :(得分:0)

如果我没有对您的旧模式做出错误的假设,那么您的正则表达式可以匹配/[a-zA-Z]/[0-9]*/

答案 4 :(得分:0)

我认为你需要的是preg_replace()

答案 5 :(得分:0)

如果只有前两个子目录段是可变的,您可以尝试:

$src = preg_replace(
   "~https?://www.domain.com/\w+/\d+/(.*?\.jpg)~"    // match regex
   "http://www.NEWdomain.com/images/$1",           // replacement
   $src);

\w表示一个字母,\d+表示匹配小数。 .*?适用于几乎所有内容,因为您没有为文件名提供任何条件。

在替换字符串中,$1刚刚变为以前与(捕获) parens匹配的内容。