Регулярное выражение, которое находит неопределенные теги HTML, которые не окружены указанными тегами HTML - PullRequest
0 голосов
/ 29 января 2019

Я пытаюсь найти регулярное выражение, которое находит все теги:

  1. НЕ является частью списка разрешенных тегов
  2. НЕ окружен определенным тегом

Это то, что у меня сейчас есть:

(?<!<noparse>)<(?!(\/?(noparse|u))).*?>(?!<\/noparse>)

Если в качестве ввода у меня есть следующее

<u><b>test2</b></u>
<noparse><u><b>test</b></u></noparse>
<noparse><b>test</b></noparse>

Это будет соответствовать

<b> & </b> (correct, not surrounded by <noparse></noparse>, <u></u> is allowed)
<b> & </b> (incorrect, surrounded by <noparse></noparse>)
</b></noparse> (incorrect, surrounded by <noparse></noparse>)

Тем не менее, я бы хотел, чтобы он совпадал с

<b> & </b>
{nothing}
{nothing}

Вы можете проверить это здесь: https://regex101.com/r/HO1Bo2/1

Я хочу сделать это, чтобы я мог очистить строки.Наше приложение сделано в Unity и использует TextMeshPro для отображения текста.TMP поддерживает довольно много тегов, все из которых вы можете найти здесь: http://digitalnativestudios.com/textmeshpro/docs/rich-text/.Мы хотим разрешить только пару из этих тегов, потому что пользователи могут стать слишком креативными и начать портить высоту строк, смещения, размер шрифта и так далее.Мы также хотим использовать тег, чтобы пользователи могли окружить любой поддерживаемый тег, чтобы он отображался в виде простого текста.

Заранее спасибо, я уверен, что вокруг меня есть более умные люди!

Ваш, Бас

1 Ответ

0 голосов
/ 21 февраля 2019

В конце концов, я пошел по другому маршруту, потому что Regex действительно не работал в этом случае.

  1. Создайте список, который будет содержать все строки, которые не должны учитываться во времяпроцесс очистки
  2. Заменить все существующие элементы формата во входной строке элементом нормализованного формата и создать резервную копию исходного элемента формата в указанном списке.

    <b>test</b> {56} <noparse><b>test</b></noparse> {3}
    becomes
    <b>test</b> {0} <noparse><b>test</b></noparse> {1}
    
  3. Заменить все существующие ... блоки, также с элементами нормализованного формата, и добавить их в тот же список.

    <b>test</b> {0} <noparse><b>test</b></noparse> {1}
    becomes
    <b>test</b> {0} {2} {1}
    
  4. Извлеките все неподдерживаемые теги в оставшейся строке и выполните санитарную обработку, используя следующее регулярное выражение:

    <(?!(\/?(u|i))).*?>
    

    В этом случае поддерживаются следующие теги, все остальные будут найдены в регулярном выражении:

    <u></u><i></i>
    

    Окружение всех неподдерживаемых тегов noparse тегами приводит к следующей строке:

    <b>test</b> {0} {2} {1}
    becomes
    <noparse><b></noparse>test<noparse></b></noparse> {0} {2} {1}
    
  5. Теперь мы можем снова заменить все элементы формата их исходным текстом

    string sanitizedString = string.Format(sanitizedStringBuilder.ToString(), replacedStrings.ToArray());  
    

    Результат:

    <noparse><b></noparse>test<noparse></b></noparse> {56} <noparse><b>test</b></noparse> {3}
    

Кажется, что работает действительно хорошо, и хотя это довольно много шагов, я довольно доволен этим решением.

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