Как РЕГЕКСИРОВАТЬ URL-адрес и тег autoadd [url] и исправить повтор

Мне нужна функция для автоматического добавления bbcode.

  1. пользователи используют мой редактор типа что-то.
  2. после отправки будет запущена функция php autolink ().
  3. если текст содержимого имеет URL, будет автоматически добавлено [url] xxx [/ url]

Я могу сделать это. Но редактор bbcode может использовать 2 формата URL

A. [url] xx [/ url] B. [url = xxx] xxx [/ url]

Я не могу исправить повторную проблему. вот демонстрационный код

$content="http://www.google.com/logo.png

[url]http://www.yahoo.com[/url]

[url=http://yahoo.com/abc.zip]DownLoad[/url]";

$content = nl2br($content);
echo linkAdd($content);//auto add link
function linkAdd($content){

preg_match_all('~\[url=((?:ftp|https?)://.*?)\](.*?)\[/url\]~s', $content, $stack);
foreach($stack[1] as $t) {
$content = preg_replace('~\[url=((?:ftp|https?)://.*?)\](.*?)\[/url\]~s','[url=\\1]\\2[/url]', $content,1);
}

preg_match_all('~\[url](.*?)\[/url\]~s', $content, $stack);
foreach($stack[1] as $t) {
$content = preg_replace('~\[url](.*?)\[/url\]~s',$t, $content,1);
}

$str=preg_replace('(((f|ht){1}tp://)[-a-zA-Z0-9@:%_/+.~#?&//=]+)','[url]\\0[/url]',$content);

return $str;
}

Теперь результаты

[url]http://www.google.com/logo.png[/url]

[url]http://www.yahoo.com[/url]

[url=[url]http://yahoo.com/abc.zip[/url]]DownLoad[/url]

Первая и вторая строка в порядке.

но в строке 3 повторите еще раз [url] XXX [/ url]

how to be
[url=[url]http://yahoo.com/abc.zip[/url]]DownLoad[/url]
to
[url=http://yahoo.com/abc.zip]DownLoad[/url]

1

Решение

Код для обработки [img] без проверки протокола:

<?php
$content="http://www.google.com/logo.png
[url]http://www.yahoo.com[/url]
[url=http://yahoo.com/abc.zip]DownLoad[/url]
[img]google.com/logo.png[/img]";

//$content="[img]google.com/logo.png[/img]";

//$content = nl2br($content);
echo linkAdd($content);
echo PHP_EOL;//auto add link
function linkAdd($content)
{
$pattern ='(
(?:\[url\])?
(
(?<!url=)
(?:f|ht)tps?://
[-a-z0-9@:%_/+.~#?&=]+
)
(?:\[/url\])?
)xi';

$str=preg_replace($pattern,'[url]$1[/url]',$content);

$pattern ='(
(?:\[img\])
([-a-z0-9@:%_/+.~#?&=]+)
(?:\[/img\])
)xi';

$str=preg_replace($pattern,'[img][url]$1[/url][/img]',$content);

return $str;
}
0

Другие решения

Я пробовал что-то попроще:

function linkAdd($content)
{
$pattern ='(
(?:\[url\])?
(
(?<!url=)
(?:f|ht)tps?://
[-a-z0-9@:%_/+.~#?&=]+
)
(?:\[/url\])?
)xi';

$str=preg_replace($pattern,'[url]\\1[/url]',$content);

return $str;
}
2

Спасибо jmleroux

этот код редактировать форму вашего ответа, это я имею в виду.

Большое спасибо!

function linkAdd($content)
{
$pattern ='(
(?:\[url\])?
(
(?<!url=)
(?:f|ht)tps?://
[-a-z0-9@:%_/+.~#?&=]+
)
(?:\[/url\])?
)xi';

$str=preg_replace($pattern,'[url]$1[/url]',$content);

$pattern ='(
(?:\[img\])
([-a-z0-9@:%_/+.~#?&=]+)
(?:\[/img\])
)xi';

$str=preg_replace($pattern,'[img]$1[/img]',$str);

return $str;
}
0
По вопросам рекламы [email protected]