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

7

我经常在正则表达式方面遇到麻烦,我基本上有一个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]);

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


2
使用 parse_url() 函数,并在路径部分进行替换。 - Ja͢ck
4个回答

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

解释:

  • ^:匹配行首
  • (:开始匹配第一组
    • https?://:匹配http或https协议
    • [^/]+:匹配除/以外的任何字符,一次或多次
    • /:匹配/
  • ):结束匹配第一组
  • [^/]+:匹配除/以外的任何字符,一次或多次 -/:匹配/
  • (:开始匹配第二组
    • .*:匹配任何字符,零次或多次(贪婪模式)
  • ):结束匹配第二组
  • $:匹配行尾

2
你可以这样做:
$image[0] = preg_replace('!^(http://[^/]*)/[^/]*!', '$1', $image[0]);

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

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

1
你可以使用简单的字符串替换来完成这个操作:

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

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

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

如果你需要使用一个你无法控制的变量来代替 /,那么你需要转义 $\number 字符,这是一项相当困难的任务。可以使用 preg_replace_callback,我的回答中有一个例子。 - Maxim Mandrik

0

不可靠的用法:

preg_replace('/(:\/\/.*?\/).*?\/()/', '$1$2', $string) 中:如果你需要放置一个来自于你无法控制的变量值而不是空字符串,那么你需要转义$\数字字符,这是一项相当困难的任务。


可靠的使用方法:

对于需要替换字符串部分的复杂正则表达式,这种方法非常有用(最重要的是,您不需要为字符$\number转义$newValue):

$newValue = '';

$newString = preg_replace_callback(
  '/(:\/\/.*?\/).*?\/()/',
  function($match) use ($newValue) { return $match[1].$newValue.$match[2]; },
  $string
);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接