Трудно полностью понять ваш вопрос, но похоже, что вы делаете обратный BBcode. Итак, оставить его в покое, если он окружен тегами? Если это так, то я думаю, что у вас возникнет интересная проблема, потому что регулярные выражения URL общеизвестно сложны.
Я думаю, что вы можете сделать это более сложным, чем нужно. Вместо этого я бы изменил все, что находится между BBcode. Вот что я думаю должно произойти:
- найти сегмент строки "[url]"
- захватить все, что происходит
- завершить захват, когда будет виден сегмент строки "[/ url]"
Это простое регулярное выражение:
$string = "[url]http://www.google.com[/url] <br><br> http://www.google.com";
$replace = "there was link";
$text = preg_replace_all($regex,$replace,$text);
echo $text;
Я знаю, что это не совсем то, о чем вы просили (на самом деле, возможно, с точностью до наоборот), но это достигнет того же результата и будет намного проще.
Вероятно, вы можете попробовать , используя отрицательные взгляды с этим регулярным выражением, но я не уверен, что это даст вам надлежащие результаты:
$regex = "#(?!\[url\])(.*)(?!\[/url\])#";
Одно важное замечание: это не дезинфицирует вводимые пользователем данные. Убедитесь, что вы делаете это, но я бы выделил логику, чтобы было очень легко увидеть, что вы делаете и где вы это делаете. Я также использовал бы библиотеку, чтобы сделать это, потому что это проще и, вероятно, безопаснее.