嗨,伙计们,我对正则表达式很陌生,你能帮我解决这个问题吗?
我有一个像这样的字符串"<input attribute='value' >"
,attribute='value'
可以是任何东西,我想做一个preg_replace
得到只是<input />
如何指定通配符来替换 srting 中任意数量的任意字符?
像这样?preg_replace("/<input.*>/",$replacement,$string);
非常感谢
嗨,伙计们,我对正则表达式很陌生,你能帮我解决这个问题吗?
我有一个像这样的字符串"<input attribute='value' >"
,attribute='value'
可以是任何东西,我想做一个preg_replace
得到只是<input />
如何指定通配符来替换 srting 中任意数量的任意字符?
像这样?preg_replace("/<input.*>/",$replacement,$string);
非常感谢
你有什么:
.*
将匹配“任何字符,并且尽可能多。
你的意思是
[^>]+
翻译为“任何字符,那不是“>”,并且必须至少有一个
或者,
.*?
这意味着“任何字符,但仅足以使此规则生效”
用正则表达式解析 HTML 很糟糕
使用任何现有的 html 解析器、DOM 库、任何东西,只是不是 NAïVE REGEX
例如:
<foo attr=">">
将被正则表达式错误地抓住为
'<foo attr=" ' with following text of '">'
这将引导你到这个正则表达式:
`<[a-zA-Z]+( [a-zA-Z]+=['"][^"']['"])*)> etc etc
在这一点上,你会发现这个可爱的宝石:
<foo attr="'>\'\"">
你的头会爆炸。
(语法荧光笔验证了我的观点,并且错误地认为我已经结束了标签。)
有些人很接近......但不是100%:
这个:
preg_replace("<input[^>]*>", $replacement, $string);
应该是这样的:
preg_replace("<input[^>]*?>", $replacement, $string);
你不希望这是一场贪婪的比赛。
如果我正确理解了这个问题,你有代码:
preg_replace("/<input.*>/",$replacement,$string);
并且您希望我们告诉您应该使用 $replacement 来删除与 .* 匹配的内容
你必须反其道而行之。使用捕获组来捕获您想要保留的内容,并将其重新插入替换中。例如:
preg_replace("/(<input).*(>)/","$1$2",$string);
当然,您实际上并不需要在这里捕获组,因为您只是重新插入文字文本。打赌上面显示了该技术,以防您想在标签可能变化的情况下执行此操作。这是一个更好的解决方案:
preg_replace("/<input [^>]*>/","<input />",$string);
否定字符类比点更具体。如果字符串中有两个 HTML 标记,则此正则表达式将起作用。你原来的正则表达式不会。
preg_replace("<input[^>]*>", $replacement, $string);
// [^>] means "any character except the greater than symbol / right tag bracket"
这真的是基本的东西,你应该赶上一些阅读。:-)