Удалите все встроенные атрибуты HTML, но оставьте некоторые - PullRequest
0 голосов
/ 12 марта 2019

Я пытаюсь написать php-функцию с preg_replace, которая удаляет все встроенные атрибуты html-элементов, но хотела оставить такие, как 'href', 'title', 'alt'.

То, что я получил до сих пор, это

([\w\-.:]+)\s*=\s*("[^"]*"|'[^']*'|[\w\-.:]+)

для маркировки всех встроенных элементов, но он все еще принимает текст, как

href="test" Test

Без всякого html-кода, кроме того, требуется всех встроенных атрибутов. Смотрите мой пример текста здесь:

[https://regex101.com/r/3OVaO2/1][1]

Цель состоит в том, чтобы удалить все опасные элементы HTML. Я знаю, что мне нужно обработать что-то для атрибута href в дополнительной функции.

1 Ответ

1 голос
/ 12 марта 2019

Как уже упоминалось в комментариях, Regex не является подходящим способом.

Это сказало: я придумал это (https://regex101.com/r/3OVaO2/2)

(<\w+\s*[^>]*)\s(?!href|title|alt)[\w\-\d]+=(?:(['"]).*?\2|\w+)

Однако, это удалит только ОДИН атрибут зла. Проблема в том, что с PCRE вы не можете иметь утверждения с переменной длиной за кадром. Если вы переключите его на ECMAscript, вы можете сделать это (https://regex101.com/r/3OVaO2/3)

(?<=<\w+\s*[^>]*)\s(?!href|title|alt)[\w\-\d]+=(?:(['"]).*?\1|\w+)

Это, вероятно, сделает то, что вы хотите. Тем не менее, это НЕ Святой Грааль для очистки HTML. Будьте осторожны с выходными данными, если не считаете их безопасными.

Кроме того, для определения тегов может потребоваться некоторая настройка, поскольку могут существовать такие теги, как <some-element>, которые в настоящее время не обнаруживаются регулярным выражением.

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