0

嗨,伙计们,我对正则表达式很陌生,你能帮我解决这个问题吗?

我有一个像这样的字符串"<input attribute='value' >"attribute='value'可以是任何东西,我想做一个preg_replace得到只是<input />

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

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

非常感谢

4

4 回答 4

10

你有什么:

.*

将匹配“任何字符,并且尽可能多。

你的意思

[^>]+

翻译为“任何字符,那不是“>”,并且必须至少有一个

或者,

.*?

这意味着“任何字符,但仅足以使此规则生效”

但不要

用正则表达式解析 HTML 很糟糕

使用任何现有的 html 解析器、DOM 库、任何东西,只是不是 NAïVE REGEX

例如:

 <foo attr=">"> 

将被正则表达式错误地抓住为

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

这将引导你到这个正则表达式:

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

在这一点上,你会发现这个可爱的宝石:

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

你的头会爆炸。

(语法荧光笔验证了我的观点,并且错误地认为我已经结束了标签。)

于 2008-11-12T21:40:50.827 回答
1

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

这个:

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

应该是这样的:

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

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

于 2008-11-12T22:32:21.940 回答
0

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

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

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

你必须反其道而行之。使用捕获组来捕获您想要保留的内容,并将其重新插入替换中。例如:

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

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

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

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

于 2008-11-13T16:55:21.803 回答
0
preg_replace("<input[^>]*>", $replacement, $string); 
// [^>] means "any character except the greater than symbol / right tag bracket"

这真的是基本的东西,你应该赶上一些阅读。:-)

于 2008-11-12T21:41:39.220 回答