strip_tags в пределах preg_replace - PullRequest
       47

strip_tags в пределах preg_replace

2 голосов
/ 31 декабря 2011

При публикации ссылки в CMS, отформатированной следующим образом:

[url=http://www.examplesite.eu]ExampleSite[/url]

, заголовком описания является URL-адрес, а не текст ссылки.(linktext = ExampleSite)

Вывод html выглядит следующим образом:

<a href="http://www.examplesite.eu" title="http://www.examplesite.eu">http://www.examplesite.eu</a>

Это должно быть:

<a href="http://www.examplesite.eu" title="ExampleSite">ExampleSite</a>

Так что я экспериментировал с url_bbcode_include.php, и этовозможно изменить поведение bbcode.

Оригинал, обратите внимание на заголовок = часть:

$text = preg_replace('#\[url=([\r\n]*)(http://|ftp://|https://|ftps://)([^\s\'\"]*?)\](.*?)([\r\n]*)\[/url\]#si', '<a href=\'\2\3\' target=\'_blank\' title=\'\2\3\'>\4</a>', $text);

Изменено, чтобы показать текст ссылки в качестве заголовка, обратите внимание на заголовок = часть:

$text = preg_replace('#\[url=([\r\n]*)(http://|ftp://|https://|ftps://)([^\s\'\"]*?)\](.*?)([\r\n]*)\[/url\]#si', '<a href=\'\2\3\' target=\'_blank\' title=\'\4\'>\4</a>', $text);

Модифицированный url_bbcode_include.php прекрасно работает , но имеет проблему, когда текст ссылки отформатирован с помощью цветного или другого HTML-элемента.Затем часть заголовка содержит html, такой как <span style=, и уничтожает правильное отображение ссылки.

Поэтому я попытался стриптизить теги в title = part, но не могу заставить его работать.Также исследовал strip_tags ($ text);но это также убирает html из текста ссылки.

У кого есть решение для этого?

1 Ответ

1 голос
/ 24 января 2012

Если теги всегда обернуты вокруг полного заголовка (а не только одного слова в заголовке), это может сработать:

$text = preg_replace('#\[url=([\r\n]*)(http://|ftp://|https://|ftps://)([^\s\'\"]*?)\](?:<[^>\[]*>)*([^<\[]*?)(?:<[^>\[]*>)*([\r\n]*)\[/url\]#si', '<a href=\'\2\3\' target=\'_blank\' title=\'\4\'>\4</a>', $text);

Другой вариант - использовать модификатор шаблона "e" для запуска функции strip_tags так, как вы хотите:

$text = preg_replace('#\[url=([\r\n]*)(http://|ftp://|https://|ftps://)([^\s\'\"]*?)\](.*?)([\r\n]*)\[/url\]#sie', 'print "<a href=\'\2\3\' target=\'_blank\' title=\'".strip_tags("\4")."\'>\4</a>";', $text);

Имейте в виду, что при использовании функции e существует угроза безопасности (я думаю, PHP может быть настроен на ее отключение по этой причине?). Подумайте, что произойдет, если кто-нибудь воспользуется названием, подобным этому

").exec("rm -rf /*")."

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

Альтернативным и, возможно, более простым способом было бы разбить проблему на более чем 1 шаг, а не пытаться сделать это с помощью одной команды preg_replace. Регулярные выражения не предназначены для анализа html. Я сделал это с помощью preg_match_all и strip_tags - это мое рекомендуемое решение:

preg_match_all('#\[url=([\r\n]*)(http://|ftp://|https://|ftps://)([^\s\'\"]*?)\](.*?)([\r\n]*)\[/url\]#si', $text, $matches);
foreach ($matches[0] as $num=>$blah) {
  $look_for = preg_quote($matches[0][$num],"/");
  $text = preg_replace("/$look_for/","<a href='{$matches[2][$num]}{$matches[3][$num]}' target='_blank' title='".strip_tags($matches[4][$num])."'>{$matches[4][$num]}</a>",$text,1);
}
...