I have a little problem with some preg_replace functions in PHP.
First I have $message = preg_replace("/\[img\](.*?)\[\/img\]/is", '<img src="$1" alt="" />', $message);
for replacing [img]http://example.com/img.png[/img] with an image. But after that I also have a preg_replace which replaces URLs:
$message = preg_replace("/(?i)\b((?:https?:\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'\".,<>?«»“”‘’]))/", '<a href="$1">title[$1]</a>', $message);
Is it possible to prevent that the URL within <img src=''
is also replaces with a link? Like putting the URL replace function before the img preg_replace and changing the pattern that it won't change URLs which are within BB-Code brackets?
Thanks for answers!
/x
modifier allows to use comments and spaces inside regexpes, without triggering any special stuff. I always make regexpes with this, but technically, it's just a small thing to make code like this more readable :). Too bad you cannot use /x
in JavaScript :(, but you can in PHP (and it's good idea, unless you have very simple regexp (Perl Best Guidelines sets that limit to 0, but you can of course choose when to use /x
)) - Konrad Borowski 2012-04-04 19:27
UPDATE: Read update below.
Sure. Use negative lookbehind to check what is behind.
The syntax of it is similar to this:
(?x)
# Match abc if there is no ' or " behind
(?<!['"]) abc
For more details see perlre.
UPDATE:
It seems that it doesn't really work. The trick literally means no '
or "
behind, so regexp actually sees something like this (where matched string is in <>
.
"http://<example.com/img>.png"
Instead of using this trick, you should read Ignore html tags in preg_replace instead. Sometimes regexp is not solution and that's one of those cases.
/(?[\]])\b((?:https?:\/\/|
at the beginning but theres always an error: preg_replace() [function.preg-replace]: Compilation failed: unrecognized character after (? at offset 2 in [...]
Dion 2012-04-04 19:43
(?[
? That doesn't seem to be actual token according to perlre. You have probably forgot <!
- Konrad Borowski 2012-04-04 19:52
(?<![\]\[])
? That doesn't work either.. How would it be in my case (that no [ or ] is in front or after the expression) - Dion 2012-04-04 20:04
]
or [
and fails if it will be found. As for after, use negative lookforward, for example (?<![\]\[])...(?![\]\[])
where ...
is your code - Konrad Borowski 2012-04-04 20:14
[IMG]http://example.com/img.png[/IMG]
returns [IMG]http://
.
Could this be caused by the expression - Dion 2012-04-04 20:18
What about
$message = preg_replace("/(?i)\b[^\"]((?:htt ...
/x
modifier with such long regexpes. It will make them way more readable - Konrad Borowski 2012-04-04 19:20