Dion
Dion

Reputation: 3345

Preg_replace overwrite

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!

Upvotes: 1

Views: 529

Answers (2)

null
null

Reputation: 11889

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.

Upvotes: 1

Eugen Rieck
Eugen Rieck

Reputation: 65342

What about

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

Upvotes: 1

Related Questions