Вы спрашивали, следует ли использовать /\[u\](.*?)\[u\]/g
или /\[u\]\([^\[u\]]+)\[u\]/g
. Оба шаблона не разработаны с конечным тегом, что важно. [u]underlined text[/u]
является BBCode
Раствор с помощью расширенного регулярное выражение может быть использование recursive patterns. Я думаю, что есть no support in JavaScript yet, но работает нормально, например PHP, который использует PCRE.
Проблема: Тэги могут быть вложенными, и это затруднит их соответствие самым внешним.
Поймите, то, что следующие модели сделать в этом PHP, например:
$str =
'The [u][u][u]young[/u] quick[/u] brown[/u] fox jumps over the [u]lazy dog[/u]';
1.) соответствия любому символу в [u]...[/u]
используя dotnon-greedy
$pattern = '~\[u\](.*?)\[/u\]~';
$str = preg_replace($pattern, '<u>\1</u>', $str);
echo htmlspecialchars($str);
выходы :
The <u>[u][u]young</u> quick[/u] brown[/u] fox jumps over the <u>lazy dog</u>
Ищет первое вхождение [u]
и съедает, как несколько символов, как это возможно, чтобы удовлетворить условную [/u]
, что приводит к меченым несовпадениям. Так что это плохой выбор.
2.) Использование negation квадратных скобок[^[\]]
для того, что находится внутри [u]...[/u]
$pattern = '~\[u\]([^[\]]*)\[/u\]~';
$str = preg_replace($pattern, '<u>\1</u>', $str);
echo htmlspecialchars($str);
выходы:
The [u][u]<u>young</u> quick[/u] brown[/u] fox jumps over the <u>lazy dog</u>
Он ищет первого совпадения [u]
следует любое количество символов, которые не являются [
или ]
для удовлетворения условий [/u]
. Это «безопаснее», поскольку оно соответствует только самым внутренним элементам, но для этого требуется дополнительное усилие, чтобы разрешить это изнутри.
3.) Использование рекурсии + negation квадратных скобок [^[\]]
для того, что находится внутри [u]...[/u]
$pattern = '~\[u\]((?:[^[\]]+|(?R))*)\[/u\]~';
$str = preg_replace($pattern, '<u>\1</u>', $str);
echo htmlspecialchars($str);
выходы:
The <u>[u][u]young[/u] quick[/u] brown</u> fox jumps over the <u>lazy dog</u>
Подобно т он второй образец: Посмотрите на первое появление [u]
, но затем ИМЕЕТ один или несколько символов, которые не являются [
или ]
ИЛИ paste the whole pattern по адресу (?R)
. Делайте все это ноль или более раз, пока не будет найдено условие [/u]
.
Чтобы избавиться от оставшихся бб-тегов внутри, которые не были решены, теперь мы можем легко удалить их:
$str = preg_replace('~\[/?u\]~',"",$str);
И получил его по своему желанию:
выходы: The <u>young quick brown</u> fox jumps over the <u>lazy dog</u>
Конечно, есть разные способы достижения этого, например preg replace callback или для JavaScript replace() method, которые могут использовать обратный вызов в качестве замены Ent.
bbcode не является обычным языком. Вы не должны пытаться анализировать его с помощью регулярных выражений. Получите парсер bbcode из github или напишите свой собственный. – Marcos