2008-11-12 4 views
0

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

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

Как использовать шаблон, чтобы заменить любое количество любых символов в srting?

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

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

ответ

10

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

.* 

будет соответствовать «любой символ, и как можно больше

что вы значит является

[^>]+ 
.

которые перевод Атес к «любой символ, тот не„>“, и должно быть по крайней мере один

или altertaively,

.*? 

что означает „любой символ, но только достаточно, чтобы сделать эту работу правила“

но не

Синтаксического HTML с регулярными выражениями является Bad

использования любой из существующих HTML анализаторами, DOM Librarys, что угодно, только не наивны REGEX

Например:

<foo attr=">"> 

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

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

что приведет вас к этому regex:

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

, в котором вы откроете для себя этот прекрасный драгоценный камень:

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

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

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

+0

Концепция с «как можно большим числом» и «достаточно» в большинстве документов называется «жадностью». – 2008-11-12 21:43:35

+1

@ Джон: Да, я знаю, но эти парни явно зеленые на этих условиях;) – 2008-11-12 21:44:56

+0

Вы были прямо на голове, часть взрыва ... из опыта. – 2008-11-19 03:15:37

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

Это действительно основной материал, вы должны catch up with some reading. :-)

1

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

Это:

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

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

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

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

0

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

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

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

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

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

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

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

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

Смежные вопросы