嗨大家我对正则表达式很新,你能帮我解决这个问题。
我有一个像"<input attribute='value' >"
这样的字符串,其中attribute='value'
可以是任何内容,我想做preg_replace
来获得<input />
如何指定通配符来替换srting中任意数量的任何字符?
像这样?preg_replace("/<input.*>/",$replacement,$string);
非常感谢
答案 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标记,则此正则表达式将起作用。你原来的正则表达式不会。