Как мне сопоставить теги textarea с определенным атрибутом? - PullRequest
2 голосов
/ 10 июля 2019

Я хочу сопоставить теги textarea только с определенным атрибутом.Учитывая, что у меня есть эта строка:

{{one}}

<div>{{two}}</div>

<textarea data-match-this="true">{{three}}</textarea>

<textarea>{{four}}</textarea>

{{five}}

В настоящее время у меня есть это регулярное выражение:

({{(?!#|\/).*?}})(?!<textarea>)(?!<\/textarea\>)

, которое в настоящее время соответствует всем тегам, кроме тех, которые находятся внутри текстовой области.Какое регулярное выражение я могу использовать, чтобы оно соответствовало тегам внутри текстовой области с атрибутом "data-match-this = 'true'"?

Вот мой Rubular: https://rubular.com/r/RuVrypBsdDVJii

Ответы [ 3 ]

3 голосов
/ 10 июля 2019

Вы бы сделали это так

/<textarea(?=\s)(?=(?:[^>"']|"[^"]*"|'[^']*')*?\sdata-match-this\s*=\s*(?:(['"])\s*true\s*\1))\s+(?:"[\S\s]*?"|'[\S\s]*?'|[^>]?)+>([\S\s]*?)<\/textarea\s*>/

https://regex101.com/r/Oy6vQd/1

Где содержимое находится в группе 2.
Примечание - позицияискомый атрибут / значение для
является независимым, он может находиться в любом месте тега.

Объяснил

 # Begin open textarea tag

 < textarea 
 (?= \s )
 (?=                    # Asserttion (a pseudo atomic group)
      (?: [^>"'] | " [^"]* " | ' [^']* ' )*?
      \s data-match-this \s* = \s* 
      (?:
           ( ['"] )               # (1), Quote
           \s* true \s*           # data-match-this = true
           \1 
      )
 )
                        # Have the data-match-this = true, 
                        # just match the rest of tag
 \s+ 
 (?: " [\S\s]*? " | ' [\S\s]*? ' | [^>]? )+

 >                      # End span tag

 ( [\S\s]*? )           # (2), textarea content
 </textarea \s* >       # Close textarea tag
1 голос
/ 10 июля 2019

Я предполагаю, что это выражение может работать, возможно, с небольшой модификацией:

^((?=(.*?<textarea.*(data-match-this="true".*))>)|(?!(.*?<textarea.*>))).*?({{(?!#|\/).*?}}).*$

, что объясняется на верхней правой панели этой демонстрации , если вы хотитеисследуйте дальше или упростите / измените его, и в этой ссылке вы можете посмотреть, как она будет шаг за шагом сопоставляться с некоторыми примерами входных данных, если хотите.

1 голос
/ 10 июля 2019

Мне удалось сопоставить только теги textarea (включая теги с классами и теги без содержимого) с data-match-this='true' с использованием этого регулярного выражения: <textarea.*data-match-this="true".*>.*<\/textarea>.Если вам нужно захватить содержимое, просто добавьте несколько скобок, например, так: <textarea.*data-match-this="true".*>(.*)<\/textarea>.Чтобы получить только теги с контентом, измените последний .* на .+: <textarea.*data-match-this="true".*>.+<\/textarea>

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