Reputation: 695
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!
Upvotes: 8
Views: 13364
Reputation: 447
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
);
Upvotes: 0
Reputation: 32052
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);
Upvotes: 2
Reputation: 14921
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 lineUpvotes: 8
Reputation: 42458
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]);
Upvotes: 1