1
votes

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!

2
Use /x modifier with such long regexpes. It will make them way more readable. - Konrad Borowski
Thanks for your quick answer, Sorry but what do you mean by /x modifier? And what would that make more readable and how? - Dion
/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
Okay, thanks for the information. Good to know this modifier. - Dion

2 Answers

1
votes

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.

1
votes

What about

$message = preg_replace("/(?i)\b[^\"]((?:htt ...