2012-04-28 2 views
0

У меня есть регулярное выражение, которое берет строку как bbcode и преобразует ее в ссылку html. Он работает нормально. но я хочу, чтобы он обнаружил тип ссылки (внутренний/внешний), чтобы решить, следует ли строго использовать абсолютный (внешний) URL-адрес, например http://extsite.com/category/keyword/, или использовать часть внутреннего URL-адреса, например category/keyword/, и добавить его к предопределенному URL-адресу, например $url . category/keyword/using preg replace to format urls

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

preg_replace('/\[([^\]]+)\]\[([^\]"]+)\]/i', '<a href="$2">$1</a>', $text) 

Любое предложение будет очень высокую оценку.

+1

Как вы определяете внутреннюю ссылку? это любая ссылка, которая не начинается с 'http: //'? – Aziz

+0

да, возможно, это может работать – medk

ответ

1

Основываясь на вашем комментарии, я предполагаю, что любая ссылка, которая начинается с http: // (или любого подобного протокола, например ftp: //), является абсолютной ссылкой. Любая другая ссылка будет считаться относительной ссылкой (и будет иметь префикс $ url)

// replace absolute links 
$text = preg replace ('/\[([^\]]+)\]\[([A-Za-z]+:\/\/[^\]"]+)\]/i', 
         '<a href="$2">$1</a>', $text) 


// replace all remaining (relative) links 
// $url must have a tailing slash '/' 
$text = preg replace ('/\[([^\]]+)\]\[([^\]"]+)\]/i', 
         '<a href="'.$url.'$2">$1</a>', $text) 
+0

ok Я уже сделал это, но с https? вместо [A-Za-z] +, но ваш пример кажется лучше, поскольку мой не поддерживает протоколы, отличные от http и https. Благодарю. – medk

+0

Как насчет '//' относительного протокола? Он по-прежнему считается внешней ссылкой '// google.com' является действительным внешним URL-адресом. –

+0

@Truth: regexp может быть изменен как таковой. Как я уже сказал, это зависит от определения «внешних» и «внутренних» связей – Aziz