Регулярное выражение: сопоставление всех неправильных атрибутов тега - PullRequest
0 голосов
/ 12 июля 2010

Для примера ввода:

<a href="abc" something=b foo="bar" baz=cool>

Я пытаюсь соответствовать:

something=b
baz=cool

Тем не менее, все, что я получаю, будет соответствовать только первому (что-то = b), даже при использовании preg_match_all. Я использую регулярное выражение:

<\w+.*?(\w+=[^"|^'|^>]).*?>

Или:

<\w+ # Word starting with <
.*?  # Anything that comes in front of the matching attribute.
(
\w+  # The attribute
=
[^"|^'|^>]+? # Keep going until we find a ", ' or >
)
.*? # Anything that comes after the matching attribute.
> # Closing >

Возможно, я делаю что-то ужасно неправильное, довольно новое для регулярных выражений. Пожалуйста, порекомендуйте! :)

редактирование:

Пересмотренное регулярное выражение:

<\w+.*?\w+=([^"\'\s>]+).*?>

image

Я тоже хочу, чтобы он совпадал с zzz = aaa;)

Ответы [ 5 ]

3 голосов
/ 12 июля 2010

Используйте библиотеку типа Tidy или HTMLPurifier , чтобы исправить неисправный HTML для вас.

0 голосов
/ 12 июля 2010

Если вы знаете, что за вашими тегами нет знака =, вы можете использовать это регулярное выражение:

(?<=\=)([^"\'\s>]+)(?=[\s>])

В этом примере он соответствует всем неправильным атрибутам

Edit:

(?<=\=)([^"\'\s/>]+)(?=[\s/?>])

также соответствует class2 в <div class=class2/>.

0 голосов
/ 12 июля 2010
<\w+
(?:
  \s+
  (?:
    \w+="[^"]*"
    |(\w+=[^\s>]+)
  )
)+
\s*/?>

Вы можете попробовать это с # разделителем и модификатором x.Я отформатировал его, чтобы он был более читабельным.

0 голосов
/ 12 июля 2010

Для начала символ каретки "^" отменяет весь класс символов. Класс символов подразумевал или операторы, это точка класса символов, поэтому ваш класс можно сократить до [^ '">]

Теперь, что касается того, почему вы получаете только тег «что-то = b», я полагаю, что вы пропустили + после своего класса персонажа.

Итак, ваше регулярное выражение с моими модификациями будет:

<\w+.*?(\w+=[^"'>]+?) .*?>

Обратите внимание на пробел после конца группы

0 голосов
/ 12 июля 2010

В вашем регулярном выражении <\w+.*?(\w+=[^"|^'|^>]).*?> часть \w+=[^"|^'|^>] не делает то, что вы думаете - вы смешиваете классы символов и чередование с символом канала

Написание регулярного выражения, которое будет перехватывать все некорректные атрибуты внутри данного тега XMLish, будет сложно, если значение атрибута может содержать > или = символов.

Например:

<a href="asd" title=This page proves that e=MC^2>

Ваше регулярное выражение пытается извлечь все атрибуты из всей строки за один шаг - оно ищет <tag, а затем атрибут без кавычек где-то позже.Таким образом, вы будете сопоставлять только один атрибут, первый.

Вы можете извлечь содержимое открывающих и закрывающих угловых скобок за один шаг, а затем искать атрибуты в этом.Регулярное выражение <\w+\s+([^>]+?)\s*> даст вам подстроку атрибутов.Ищите в этой строке атрибуты без кавычек.Если атрибуты простые (так как они не содержат пробелов), вы можете использовать простые

\w+=(?=[^"'])[^ ]+

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

\w+=(?=[^"']).+?(?=\w+=|$)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...