BBCode в XHTML:Две возможности, одно регулярное выражение?
Вопрос
Я пишу небольшой модуль для блога.Я хочу, чтобы пользователи могли вводить BBCode.Мне нужно преобразовать это в XHTML для сохранения в базе данных, что мне удалось сделать для большинства тегов, за исключением [url]
.
Есть два случая, которые я хочу разрешить:
[url=http://stackoverflow.com/]
который должен быть преобразован в
<a href="http://www.stackoverflow.com">http://www.stackoverflow.com</a>
и
[url=http://stackoverflow.com/]StackOverflow[/url]
который должен быть преобразован в
<a href="http://www.stackoverflow.com" title="StackOverflow">StackOverflow</a>
К сожалению, я не смог этого сделать.Результаты ужасны, и мне интересно, можно ли это сделать с помощью одного регулярного выражения или его нужно разделить на два.
Решение
Это должно сработать:
\[url\s*=\s*([^\]]*)]\s*((?:(?!\s*\[/url\]).)*)\s*\[/url\]|\[url\s*=\s*([^\]]*)]
Шаблон замены:
<a href="$1$3" title="$2">$2$3</a>
Протестировано с помощью этого ввода:
bla [url=http://stackoverflow.com/]StackOverflow[/url] bla
bla [url=http://stackoverflow.com/] bla
ВОЗВРАТ:
bla <a href="http://stackoverflow.com/" title="StackOverflow">StackOverflow</a> bla
bla <a href="http://stackoverflow.com/" title="">http://stackoverflow.com/</a> bla
Обратите внимание, что в любом случае вам, возможно, придется добавить некоторую проверку / экранирование в качестве недопустимых символов XML (", <, > и т.д.) может "нарушить" содержимое тега.
Другие советы
Что-то вроде этой ужасной работы должно это сделать:
\[url=([^\]]+)\](?:([^\[]+)\[\/url\])?
После сопоставления URL-адрес должен быть указан в $ 1, а текст - в $ 2, если он был указан.Я еще не тестировал это, так что это может потребовать некоторой настройки.
Функция анализа BBCode2HTML($text)
https://code.google.com/p/pwision/source/browse/trunk/inc/BBCode.inc#150
Алгоритм преобразования BBCode 2 HTML таков:1) отрегулируйте текст BBCode код здесь:https://code.google.com/p/pwision/source/browse/trunk/inc/BBCode.inc#60
2) преобразуйте регулируемый BBCode в XML код здесь:https://code.google.com/p/pwision/source/browse/trunk/inc/BBCode.inc#101
3) запустите преобразование XSLT в XML-текст.Файл XSLT находится здесь https://code.google.com/p/pwision/source/browse/trunk/inc/BBCodeXML2HTML.xslt Трансформация производится здесь:https://code.google.com/p/pwision/source/browse/trunk/inc/BBCode.inc#113
Надеюсь, я помог!
PS:хороший учебник по XSLT вы можете найти здесь:http://www.w3schools.com/xsl/xsl_languages.asp