Регулярное выражение для удаления атрибутов и значений из тегов html

Привет, ребята, я новичок в регулярных выражениях, вы можете мне с этим помочь.

У меня есть строка вроде этой "<input attribute='value' >", где attribute='value' может быть чем угодно, и я хочу сделать preg_replace, чтобы получить только <input />.

Как указать подстановочный знак для замены любого количества любых символов в srting?

нравится? preg_replace("/<input.*>/",$replacement,$string);

Большое спасибо

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
1 366
4

Ответы 4

Что у тебя есть:

.*

будет соответствовать "любому персонажу и как можно большему количеству символов".

что ты такое иметь в виду

[^>]+

что переводится как "любой символ, это не"> ", и должен быть хотя бы один

или альтернативно,

.*?

что значит "любой персонаж, но ровно столько, чтобы это правило работало"

НО НЕ

Разбор HTML с помощью регулярных выражений - Плохой

использовать любой из существующих парсеров html, библиотек DOM, что угодно, ТОЛЬКО НЕ НАИВНЫЙ РЕГЕКС

Например:

 <foo attr = ">"> 

Будет ошибочно захвачен регулярным выражением как

'<foo attr = " ' with following text of '">' 

Что приведет вас к этому регулярному выражению:

 `<[a-zA-Z]+( [a-zA-Z]+=['"][^"']['"])*)>  etc etc 

в этот момент вы обнаружите этот прекрасный драгоценный камень:

 <foo attr = "'>\'\"">

и твоя голова взорвется.

(Подсветка синтаксиса подтверждает мою точку зрения и неверно совпадает с мнением, что я закончил тег.)

Концепция «как можно больше» против «ровно столько» в большей части документации называется «жадностью».

John Nilsson 13.11.2008 00:43

@John: да, я знаю, но эти парни явно зеленые в этих условиях;)

Kent Fredric 13.11.2008 00:44

Вы были правы в части взрыва головы ... говоря по опыту.

Michael Galos 19.11.2008 06:15

Как вы можете подумать, что такое чудовище, как "<foo attr = '>'>", было даже возможный в HTML? Я знаю, что вы говорите о XSS, но я полагаю, что мы не рассматриваем вопрос «Как очистить неправильный ввод пользователя?» вопрос здесь. Само по себе разрешение пользователям вводить HTML - это большая проблема.

Tomalak 19.11.2008 14:04
preg_replace("<input[^>]*>", $replacement, $string); 
// [^>] means "any character except the greater than symbol / right tag bracket"

Это действительно материал базовый, вам стоит наверстать упущенное с чтением. :-)

Это почти работает, но не работает с атрибутами, в значении которых есть '>', например. <input attr = "3> 2">.

Adam Rosenfield 13.11.2008 00:43

@Adam: это точно, почему вы не должны использовать Regex для синтаксического анализа html.

Kent Fredric 13.11.2008 00:45

Как ни странно, похоже, что разрешение> в значениях атрибутов было сделано только для того, чтобы указать против использования регулярных выражений в HTML (я никогда не видел, чтобы это использовалось в реальной жизни). Но это хороший момент.

PhiLho 13.11.2008 01:17

@PHiLho, надеюсь, не используется в реальной жизни, но это один из способов, которыми люди создают код для целей XSS. И это быстро становится уродливым.

Kent Fredric 19.11.2008 11:17

К сожалению, в значениях атрибутов нет символов '>'. Никогда. Если есть в ваш HTML, перед вами совершенно другая проблема.

Tomalak 19.11.2008 13:50

Я бы не сказал, что это базовый, каким бы то ни было образом. Убедиться, что вы правильно сопоставляете HTML, довольно сложно, особенно когда вы начинаете пытаться сопоставить вложенные теги.

localshred 21.11.2008 02:56

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

Tomalak 21.11.2008 11:26

Вы правы - символ '>' внутри атрибутов недействителен, но самый популярный браузер может правильно его проанализировать в большинстве случаев (если значение атрибута указано правильно). Пример реального кода с '>' внутри значения атрибута: <input ... onkeypress = "if (this.length> 10) return false;">

Rusted 10.05.2012 01:31

Некоторые были близки ... но не на 100%:

Этот:

preg_replace("<input[^>]*>", $replacement, $string);

должно быть это:

preg_replace("<input[^>]*?>", $replacement, $string);

Вы же не хотите, чтобы это был жадный матч.

Жадность здесь не имеет значения, поскольку использование [^>] * вместо. * Приведет к тому, что он будет соответствовать всем не-> символам до тех пор, пока не будет найден>, и самые длинные (жадные) и самые короткие (не жадные) прогоны не- > символы, за которыми следует>, будут идентичны во всех случаях.

Dave Sherohman 13.11.2008 03:25

Если я правильно понял вопрос, у вас есть код:

preg_replace("/<input.*>/",$replacement,$string);

и вы хотите, чтобы мы сказали вам, что вы должны использовать для замены $, чтобы удалить то, что было найдено. *

Вы должны сделать это наоборот. Используйте группы захвата, чтобы захватить то, что вы хотите сохранить, и повторно вставьте это в замену. Например.:

preg_replace("/(<input).*(>)/","$1$2",$string);

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

preg_replace("/<input [^>]*>/","<input />",$string);

Класс инвертированных символов более конкретен, чем точка. Это регулярное выражение будет работать, если в строке есть два тега HTML. Ваше исходное регулярное выражение не будет.

Другие вопросы по теме