8

I always have trouble with regex, I basically have a url, for example:

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

What I need is a preg_replace() to replace the something_here with an empty string, and leave everything else in tact.

I have tried the following and it replaces the wrong parts:

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

This ends up leaving only the part I want to replace, rather than actually replacing it!

1
  • 2
    Use parse_url() for this and do the replacement on the path portion. Commented Jul 25, 2013 at 8:44

4 Answers 4

8

The following code is based on the description you provided:

$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

Explanation:

  • ^ : match begin of line
  • ( : start matching group 1
    • https?:// : match http or https protocol
    • [^/]+ : match anything except / one or more times
    • / : match /
  • ) : end matching group 1
  • [^/]+ : match anything except / one or more times -/ : match /
  • ( : start matching group 2
    • .* : match anything zero or more times (greedy)
  • ) : end matching group 2
  • $ : match end of line
Sign up to request clarification or add additional context in comments.

Comments

2

You could do this:

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

Or you might consider just splitting the string to work on its individual components:

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

Comments

1

You could do this with a simple string replace:

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

Or if you want to use a regular expression:

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

1 Comment

If instead of / you need to put value from a variable that you do not control, then you need to escape the $ and \number characters, and this is quite a difficult task. Use preg_replace_callback, an example is in my answer to the question.
0

Unreliable usage:

In preg_replace('/(:\/\/.*?\/).*?\/()/', '$1$2', $string): if instead of empty string you need to put value from a variable that you do not control, then you need to escape the $ and \number characters, and this is quite a difficult task.


Reliable usage:

For difficult regular expressions where you need to replace part of a string, it can be very useful to do so (and most importantly, you don't need to escape $newValue for the characters $ and \number):

$newValue = '';

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.