Я пишу небольшой модуль блога. Я хочу, чтобы пользователи могли набирать BBCode. Мне нужно преобразовать это в XHTML для хранения в БД, что мне удалось сделать для большинства тегов, кроме [url].
[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
Алгоритм преобразования HTML-кода BBCode 2: 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