2009-12-27 3 views
0

У меня проблема с моим RegEx. Я хочу перевести BBCode Ссылка какПомощь с RegEx

[ссылка = www.stackoverflow.com] Stack-Overflow [/ ссылка]

в HTML Ссылка как

<a href='www.stackoverflow.com'>Stack-Overflow</a>. 

В моей Строка в BBCode позволяет сделать несколько ссылок. Мне также нужна функция для перевода html обратно на BBCode.

Мои функции BBCode To HTML:

$Text = preg_replace('/\[link=([^ ]+).*\](.*)\[\/link\]/', '<a href="$1">$2</a>', $Text); 

HTML Чтобы BBCode:

$Text = preg_replace('/\<a href="([^ ]+).*\">(.*)\<\/a\>/Usi', '[link=$1]$2[/link]', $Text); 

Моя проблема с thees функций, когда у меня есть более чем одно звено, это не работает , и когда у меня есть одна ссылка, переведенная в HTML, и я хочу перевести назад, у меня есть только первый символ ссылки.

Можете ли вы мне помочь? Заранее спасибо

+2

Обратите внимание: http://kore-nordmann.de/blog/do_NOT_parse_using_regexp.html – pavium

ответ

5

Что касается вашей первой проблемы, то * является жадным, поэтому он ловит все между первым и последним ссылками. Простое решение заключается в использование нежадного спецификатора, или не позволять [] в ваших группах:

\[link=([^ \[\]]+)\]([^\[\]]*)\[\/link\] 

Аналогичным образом, наоборот:

<a href="([^ "]+)">([^<]*?)\<\/a\> 

Вот нежадная версия. Это позволяет [] в ссылках, и еще короче:

\[link=([^ ]*?)\](.*?)\[\/link\] 
+1

Использование нежадным классификатор является достаточно хорошим, и позволит [] в ссылке, так как это может произойти. Например. example.com/?arr[]=1&arr[]=2 –

+0

Хорошая точка. Спасибо, Тор. – Kobi

+0

благодарит за вашу помощь. это было очень полезно. Он работает отлично. – wildhaber

0

Ваша проблема с жадным * использования.? сделать его не жадным.

$Text = preg_replace(
    '/\[link=([^ ]+).*?\](.*?)\[\/link\]/', 
    '<a href="$1">$2</a>', 
    $Text 
); 
+0

он должен быть внутри parens, иначе он делает что-то совершенно другое. –

+0

Ой, да, плохо. Отредактировано для исправления ошибки. – slebetman