BBCode в XHTML:Две возможности, одно регулярное выражение?

StackOverflow https://stackoverflow.com/questions/1632798

  •  06-07-2019
  •  | 
  •  

Вопрос

Я пишу небольшой модуль для блога.Я хочу, чтобы пользователи могли вводить 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top