preg_replace()只有字符串的特定部分

时间:2013-07-25 08:13:04

标签: php regex replace preg-replace

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

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]);

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

3 个答案:

答案 0 :(得分:7)

以下代码基于您提供的说明:

$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
  • $:匹配行尾

答案 1 :(得分:2)

你可以这样做:

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

或者您可以考虑将字符串拆分为适用于其各个组件:

$parts = explode('/', $image[0]);
unset($parts[3]);
$image[0] = implode('/', $parts);

答案 2 :(得分:1)

您可以使用简单的字符串替换来执行此操作:

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

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

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