Регулярные выражения - Обработка ссылок после BB

urisff

Новичок
Регулярные выражения - Обработка ссылок после BB

Здравствуйте, товарищи!

Требуется помощь.

Я хочу сделать, чтобы после того как BB распознаёт ссылки вида
Код:
[URL]http://tireal.com[/URL]
и
[URL=http://tireal.com]http://tireal.com - TIREAL company[/URL]
я мог распознать также другие ссылки, не обозначенные пользователем специально.

По отдельности легко сделать и то и другое.
1. Обработка тега URL в BB:
Код:
$s=preg_replace("/(\[url=)(.*)(\])(.*)(\[\/url\])/i","<a target=\"_blank\" href=\"redirect.php?$2\">$4</a>", $s);
$s=preg_replace("/(\[url\])(.*)(\[\/url\])/i","<a target=\"_blank\" href=\"redirect.php?$2\">$2</a>", $s);
2. Автоматическое распознавание:
Код:
$s=preg_replace("/(([a-zA-Z]+:\/\/)([a-z][a-z0-9_\..-]*[a-z]{2,6})([a-zA-Z0-9\/*?.!;@_\-+=&%]*[a-zA-Z0-9\/]))/i", "<a target=\"_blank\" href=\"redirect.php?$1\">$1</a>", $s);
Но как запретить функции 2 обрабатывать ссылки, которые содержатся в тексте после того, как их обработал BB.
Это актуально и для BB-тега [ IMG ], ссылки на картинку тоже не должны быть распознаны как самостоятельные ссылки.

Догадываюсь, что надо как-то запретить обработку ссылок, заключённых в HTML-теги, но как это сделать?

Возможно кто-то из вас это делал много раз, в таком случае буду благодарен, если поделитесь кодом или ссылкой.
 

urisff

Новичок
Автор оригинала: triumvirat
У Вас в обрабатываемой строке что ли и HTML и ВВ вперемешку?
Нет, приведу пример.

Есть текст:
Код:
[ URL ]http://tireal.com[ /URL ]
[url]http://tireal.com[/url]
После функции, обрабатывающей BB-коды, мы получим:
Код:
<a href=http://tireal.com>[url]http://tireal.com[/url]</a>
[url]http://tireal.com[/url]
После функции, обрабатывающей не обозначенные ссылки:
Код:
<a href=<a href=http://tireal.com>[url]http://tireal.com[/url]</a>><a href=http://tireal.com>[url]http://tireal.com[/url]</a></a>
<a href=http://tireal.com>[url]http://tireal.com[/url]</a>
То есть этот код обработает и обычную ссылку и уже ТО, что ей является после того, как постаралась BB-функция.

Должно быть в итоге:
Код:
<a href=http://tireal.com>[url]http://tireal.com[/url]</a>
<a href=http://tireal.com>[url]http://tireal.com[/url]</a>
 

Духовность™

Продвинутый новичок
Надо так делать:

1. Перед внесением информации в БД не обозначенные ссылки обрабатывать ВВ-кодами.
2. При выводе из БД заменять ВВ на HTML.

Все. Тогда проблем не возникнет - сам так делал. А у Вас какая-то странная последовательность действий.
 

urisff

Новичок
Автор оригинала: triumvirat
Надо так делать:

1. Перед внесением информации в БД не обозначенные ссылки обрабатывать ВВ-кодами.
2. При выводе из БД заменять ВВ на HTML.

Все. Тогда проблем не возникнет - сам так делал. А у Вас какая-то странная последовательность действий.
Да, всё верно.

Но как определить не обозначенные ссылки?

То есть нужна команда, которая превратит http://tireal.com в [ URL ]http://tireal.com[ /URL ]
и при этом НЕ сделает так, что [ URL ]http://tireal.com[ /URL ] станет [ URL ][ URL ]http://tireal.com[ /URL ][ /URL ].
 

Духовность™

Продвинутый новичок
Но как определить не обозначенные ссылки?
как-как. надо проверить, что первый символ идущий перед ссылкой не является знаком равно или скобкой ]
и что последний символ ссылки не скобки [ и ]

когда я реализовывал подобное, я делал так. (к сожалению, этот код так и не был реализован в проектах за ненадобностью ВВ), но он работает:

PHP:
// Эта функция берёт содержимое кармана 1 переданного функцией preg_replace_callback
// см. ниже и просто добавляет протокол, если его нет у ссылки начинающейся с www.
function prefix_url($in)
{
	$in[1] = strToLower($in[1]);
	
	if ($in[1]=="www.")
	{
	    $in[1] = "http://www.";
	}
	
	return "[*URL=$in[1]$in[2]]$in[1]$in[2][/URL*]";
}

// Обрамляем URL-ссылки тегами вида [*URL=...]...[/URL*]
// ПЕРЕД внесением в базу
function ereg_post_urls($in)
{
    $in = preg_replace_callback(
    "#
        (?:^|[^=\\]/])
            (
            (?:f|ht)tps?://(?:www\\.)?|www\\.
            )
            
            (
            (?:[\w\\-.]+/?\\.[a-z]{2,4})/?~?
            (?:[\w\\-./\\#]+)?
            (?:\\?[^\s]+)?
            )
        (?:[^\\[\\]]|$)
    #ix",
    "prefix_url", $in);
    
    return $in;
}

$str = '[*url=http://www.yandex.ru]обычный ВВ-url[/url*] <br>
www.phpclub.ru <br>
http://www.php.net ';

echo ereg_post_urls($str);
только * убери а то форум BB преобразовывает
 
Сверху