регулярное выражение для удаления атрибутов и значений из HTML-тегов - PullRequest
0 голосов
/ 13 ноября 2008

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

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

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

как это? preg_replace("/<input.*>/",$replacement,$string);

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

Ответы [ 4 ]

10 голосов
/ 13 ноября 2008

Что у вас есть:

.*

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

что вы имеете в виду есть

[^>]+

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

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

.*?

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

НО НЕ

Разбор HTML с регулярными выражениями равен Плохо

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

Например:

 <foo attr=">"> 

Реггекс будет неправильно схвачен как

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

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

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

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

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

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

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

1 голос
/ 13 ноября 2008

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

Это:

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

должно быть так:

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

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

0 голосов
/ 13 ноября 2008

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

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

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

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

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

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

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

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

0 голосов
/ 13 ноября 2008
preg_replace("<input[^>]*>", $replacement, $string); 
// [^>] means "any character except the greater than symbol / right tag bracket"

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

...