Заключенная плата POSIX для сопоставления всех тегов HTML (Start/Self-Closing/End) всех void или нормальных элементовHtml

Программисты Html
Ответить
Anonymous
 Заключенная плата POSIX для сопоставления всех тегов HTML (Start/Self-Closing/End) всех void или нормальных элементов

Сообщение Anonymous »

Обязательное утверждение: я знаю, что анализ html с помощью резервуара невозможно/невозможно. Моя проблема отличается: мне нужна только регулярное выражение, которое может найти все теги из очень ограниченного подмножества HTML. Таким образом, это упрощенная токенизация, а не анализ. , , элементы и т. Д.).
Я взял рефлексию из этого ответа и преобразовал его в форму, совместимую с Gawk (беспристрастно):

Код: Выделить всё

/\/]*)(=\s*("[^"]*"|\047[^\047]*\047|[^[:space:]>]+)|[^>])*(>|$)/
< /code>
Но это не решает проблему, если теги могут содержать произвольные ошибки. Например, < /p>
echo '135' | LC_ALL=en_US.utf8 gawk 'BEGIN {IGNORECASE = 1}
{
s = gensub(/\/]*)(=\s*("[^"]*"|\047[^\047]*\047|[^[:space:]>]+)|[^>])*(>|$)/, "(tag)", "g", $0);
print(s)
}'
prints (TAG) 1 (TAG) 3 (TAG) 5 вместо правильного вывода (TAG) 0 (TAG) "> 1 (TAG) 2 (TAG)"> 3 (TAG) 4 (TAG) "> 5 . Обратите внимание, что существует таблица символа U+0009 INTE 3 ]+)|[^>])*(>|$)/
< /code>
выводит правильные результаты практически для всех входов, которые могут возникнуть на практике, включая входы с ошибками. Например, ввод из этого ответа: < /p>
echo '
0&e link 3' | LC_ALL=en_US.utf8 gawk 'BEGIN {IGNORECASE = 1}
{
s = gensub(/]*(>|$)|]*)(\s+[^[:space:]\/>]+\s*=\s*("[^"]*"|\047[^\047]*\047|[^[:space:]>]+)|[^>])*(>|$)/, "(tag)", "g", $0);
print(s)
}'
[/code]
prints (Tag) 0 (Tag) 1 & amp (TAG) 2 < -> & E Link 3 (TAG) , который является ожидаемым выходом.
или, например,

Код: Выделить всё

echo '23' | LC_ALL=en_US.utf8 gawk 'BEGIN {IGNORECASE = 1}
{
s = gensub(/]*(>|$)|]*)(\s+[^[:space:]\/>]+\s*=\s*("[^"]*"|\047[^\047]*\047|[^[:space:]>]+)|[^>])*(>|$)/, "(tag)", "g", $0);
print(s)
}'
prints (Tag) 2 (Tag) 3 , который является ожидаемым выводом. Но в некоторых случаях это дает неверные совпадения, потому что он неправильно кодирует логику: а именно, он не может определить роль U+003D, соответствующего знаку , то есть, относится ли = к атрибуту (подключенному или не подключенному к значению атрибута) или подключает имя атрибута со значением атрибута или принадлежит значению атрибута. Например, < /p>

Код: Выделить всё

echo '135' | LC_ALL=en_US.utf8 gawk 'BEGIN {IGNORECASE = 1}
{
s = gensub(/]*(>|$)|]*)(\s+[^[:space:]\/>]+\s*=\s*("[^"]*"|\047[^\047]*\047|[^[:space:]>]+)|[^>])*(>|$)/, "(tag)", "g", $0);
print(s)
}'
prints (Tag) 1 (Tag) 3 (Tag) 4 (Tag) "> 5 вместо правильного вывода (TAG) 0 (TAG)"> 1 (TAG) 2 (TAG) 3 (TAG) 5 .
Так что мой вопрос: возможно ли улучшать второй regex, что это будет исправлять, что вывод и вывод, что это будет, что -то, что вывод, так что это будет, так что это может быть вход. Места?>

Подробнее здесь: https://stackoverflow.com/questions/795 ... -of-all-vo
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Html»