正则表达式从html标记中去除属性和值

时间:2008-11-12 21:36:51

标签: php regex preg-replace

嗨大家我对正则表达式很新,你能帮我解决这个问题。

我有一个像"<input attribute='value' >"这样的字符串,其中attribute='value'可以是任何内容,我想做preg_replace来获得<input />

如何指定通配符来替换srting中任意数量的任何字符?

像这样? preg_replace("/<input.*>/",$replacement,$string);

非常感谢

4 个答案:

答案 0 :(得分:10)

你有什么:

.*

将匹配“任何角色,并尽可能多。

意味着什么

[^>]+

转换为“任何字符,不是”&gt;“,并且必须至少有一个

或更改,

.*?

这意味着 “任何角色,但只足以使这条规则有效”

但不要

使用regexp解析HTML 错误

使用任何现有的html解析器,DOM库,任何东西,JustNOTNAïVEREGEX

例如:

 <foo attr=">"> 

将正则表达式错误地抓住

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

这会引导你进入这个正则表达式:

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

此时你会发现这个可爱的宝石:

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

你的脑袋会爆炸。

(语法高亮显示验证了我的观点,错误地认为我已经结束了标记。)

答案 1 :(得分:1)

有些人很接近......但不是100%:

此:

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

应该是这样的:

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

你不希望那是一场贪婪的比赛。

答案 2 :(得分:0)

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

这实际上是基本的内容,你应该catch up with some reading。 : - )

答案 3 :(得分:0)

如果我正确理解了这个问题,你就得到了代码:

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

并且您希望我们告诉您应该使用$ replacement来删除匹配的内容。*

你必须以相反的方式解决这个问题。使用捕获组捕获要保留的内容,然后将其重新插入替换中。 E.g:

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

当然,你不需要在这里捕获组,因为你只是重新插入文字文本。如果您想在标签可以变化的情况下执行此操作,请在上面显示该技术。这是一个更好的解决方案:

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

否定的字符类比点更具体。如果字符串中有两个HTML标记,则此正则表达式将起作用。你原来的正则表达式不会。