6

我总是遇到正则表达式的问题,我基本上有一个 url,例如:

http://somedomain.com/something_here/bla/bla/bla/bla.jpg

我需要的是一个 preg_replace() 来something_here用一个空字符串替换它,并保留其他所有内容。

我尝试了以下方法,它替换了错误的部分:

$image[0] = preg_replace('/http:\/\/(.*)\/(.*)\/wp-content\/uploads\/(.*)/','$2' . '',$image[0]);

这最终只留下了我想要替换的部分,而不是实际替换它!

4

3 回答 3

8

以下代码基于您提供的描述:

$url = 'http://somedomain.com/something_here/bla/bla/bla/bla.jpg';
$output = preg_replace('#^(https?://[^/]+/)[^/]+/(.*)$#', '$1$2', $url);
echo $output; // http://somedomain.com/bla/bla/bla/bla.jpg

解释:

  • ^: 匹配行首
  • (: 开始匹配组 1
    • https?://: 匹配 http 或 https 协议
    • [^/]+:匹配除/一次或多次以外的任何内容
    • /: 匹配/
  • ): 结束匹配组 1
  • [^/]+:匹配除/一次或多次之外的任何内容 - /:匹配/
  • (: 开始匹配组 2
    • .*: 匹配任何东西零次或多次(贪婪)
  • ): 结束匹配组 2
  • $: 匹配行尾
于 2013-07-25T08:27:55.603 回答
2

你可以这样做:

$image[0] = preg_replace('!^(http://[^/]*)/[^/]*!', '$1', $image[0]);

或者您可以考虑只拆分字符串以处理其各个组件:

$parts = explode('/', $image[0]);
unset($parts[3]);
$image[0] = implode('/', $parts);
于 2013-07-25T08:49:02.590 回答
1

您可以通过简单的字符串替换来做到这一点:

$image[0] = str_replace('/wp-content/uploads/', '/', $image[0]);

或者,如果您想使用正则表达式:

$image[0] = preg_replace('~(http://.*?)/wp-content/uploads/(.*)~', '$1/$2', $image[0]);
于 2013-07-25T08:21:27.397 回答