Я бы эти 3 одним регекспом не делал. Можно конечно, но слишком запутаный код получится.
Вот пример для URL-а :
function highlight_url($url) {
if (preg_match("~^(?:(?:https?)://(?:[a-z0-9_-]{1,32}".
"(?::[a-z0-9_-]{1,32})?@)?)?(?:(?:[a-z0-9-]{1,128}\\.)+(?:com|net|".
"org|mil|edu|arpa|gov|biz|info|aero|inc|name|[a-z]{2})|(?!0)(?:(?".
"!0[^.]|255)[0-9]{1,3}\\.){3}(?!0|255)[0-9]{1,3})(?:/[a-z0-9.,_@%&".
"?+=\\~/-]*)?(?:#[^ \'\\"&<>]*)?$~i",$url)) {
return \'<a href="\'.$url.\'" target="blank">\'.htmlspecialchars($url).\'</a>\';
} else {
return \'[ url]\'.htmlspecialchars($url).\'[/url]\';
}
}
$str = "test
[ url]http://ya.ru[/url] test
[ url]javascript:alert(\'test\')[/url]";
echo preg_replace("~\\[url\\](.+?)\\[\\/url\\]~ei", "highlight_url(\'\\\\1\')", $str);
скорее всего форум некоторые слеши повырезает, поэтому смотри логику а не copy/paste