Разбить строку (которая содержит теги) по пробелам, не разбивая теги или тег внутреннего HTML в Javascript - PullRequest
1 голос
/ 26 сентября 2011

Я пытаюсь разбить строку по пробелам на массив слов.Если строка содержит HTML-теги, я бы хотел, чтобы полный тег (включая содержимое) обрабатывался как одно слово.

Например,

I like to eat <a href="http://www.waffles.com/">tasty delicious waffles</a> for breakfast

следует разделить на

I
like
to
eat
<a href="http://www.waffles.com/">tasty delicious waffles</a>
for
breakfast

Я видел несколько связанных потоков по переполнению стека, но у меня возникли проблемы с адаптацией чего-либо к Javascript, потому что они были написаны для языков, с которыми я не совсем знаком.Есть ли регулярное выражение, которое могло бы легко это сделать, или решение потребует многократного разбиения регулярного выражения и итерации?

Спасибо.

Ответы [ 2 ]

6 голосов
/ 26 сентября 2011
result = subject.match(/<\s*(\w+\b)(?:(?!<\s*\/\s*\1\b)[\s\S])*<\s*\/\s*\1\s*>|\S+/g);

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

Пояснение:

<\s*            # Either match a < (+ optional whitespace)
(\w+\b)         # tag name
(?:             # Then match...
 (?!            # (as long as it's impossible to match...
  <\s*\/\s*\1\b # the closing tag here
 )              # End of negative lookahead)
 [\s\S]         # ...any character
)*              # zero or more times.
<\s*\/\s*\1\s*> # Then match the closing tag.
|               # OR:
\S+             # Match a run of non-whitespace characters.
1 голос
/ 26 сентября 2011

Это сложно или невозможно сделать только с помощью регулярного выражения (в зависимости от сложности HTML, которую вы хотите / нужно разрешить).

Вместо этого, переберите дочерние элементы родительского узла и разделите их, если ониявляются текстовыми узлами или распечатывают их без изменений, если они не являются текстовыми узлами.

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