2011-12-31 2 views
2

При размещении на ссылку в CMS, отформатированный как это:strip_tags внутри preg_replace

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

описание название URL-адрес вместо LinkText. (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); 

Модифицированный показать LinkText в качестве заголовка, обратите внимание на название = часть:

$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 работает прекрасно , но имеет проблема, когда linktext отформатирован с цветом или другим элементом html. Затем заголовочная часть содержит html, например <span style=, и уничтожает правильное отображение ссылки.

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

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

+0

Можете ли вы привести пример того, как заголовок часть содержит теги? Являются ли теги всегда обернутыми вокруг полного названия, или они могут просто обернуть одно слово в заголовке? –

+0

@Highly Нерегулярные. Вот пример вывода html: interactieve television'>interactieve-television Karel

ответ

1

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

$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); 

Другой вариант заключается в использовании «е» модификатор шаблона для запуска 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); 

Имейте в виду, что хотя есть риск безопасности в использовании функции е (я думаю, что 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); 
} 
+0

Рекомендуемое решение работает отлично! – Karel