Regex для фильтрации списков BBCode - PullRequest
0 голосов
/ 08 марта 2019

Я пытаюсь улучшить устаревший код PHP, который занимается очисткой BBCode от строки, и в настоящее время столкнулся с проблемой со списками.

Текущее решение для списков делает следующее:

...
$search[]  = sprintf('~\[%s\](.*)\[/%s\]~smUi', 'list', 'list');
$search[]  = sprintf('~\[%s=(.*)\](.*)\[/%s\]~smUi', 'list', 'list');
$search[]  = sprintf('~\[\%s\]~i', '*');
$replace[] = '$1';
$replace[] = '$2';
$replace[] = '';
...
return preg_replace($search, $replace, $string);

Это прекрасно работает, когда строка похожа на

[list]
  [*]Item 1
  [*]Item 2
  [*]Item 3
[/list]

Но он также удалит [*], если его нет в списках, а также произойдет сбой с такими вещами, как:

[list]
  [*][list]
    [*]Item 1.1
    [*]Item 1.2
    [*]Item 1.3
  [/list]
  [*]Item 2
  [*]Item 3
[/list]

Возможно ли использование RegExp только для удаления тегов [list] или [list=1] + [/list] вместе с [*], если они находятся в списках?

1 Ответ

0 голосов
/ 08 марта 2019

Вы можете использовать

$search[]  = sprintf('~\[(%s)(?:=[^]]*)?]((?:(?!\[\1\b).)*?)\[/\1]\s*~si', 'list');
$search[]  = sprintf('~\[%s]~i', '\\*');
$replace[] = '$2';
$replace[] = '';
$count = 0;
do {
  $string = preg_replace($search, $replace, $string, -1, $count);
}
while ($count > 0);
return $string;

См. Демонстрационную версию PHP .

Я слил первые два регулярных выражения, поскольку они в основном совпадают (часть =.*?)внутри открытого тега просто необязательно, я предлагаю использовать (?:=[^]]*)? для соответствия =, а затем 0+ символов, отличных от ] 1 или 0 раз.

Шаблон ((?:(?!\[\1\b).)*?) представляет собой закаленный жадный токен , который обеспечивает соответствие самого внутреннего тега list, здесь \1 соответствует имени тега, захваченному с помощью (%s).

Переменная $count будет содержать числозамены выполняются с preg_replace, и если ничего не заменяется, блок while выходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...