Php 正则表达式从html标记中剥离属性和值

Php 正则表达式从html标记中剥离属性和值,php,regex,preg-replace,Php,Regex,Preg Replace,嗨,伙计们,我对regex很陌生,你能帮我吗 我有一个像这样的字符串,其中attribute='value'可以是任何东西,我想做一个preg\u replace来得到 如何指定通配符来替换srting中任意数量的任意字符 像这样预替换(“/”,$replacement,$string) 非常感谢您所拥有的: .* 将匹配“任何字符,并尽可能多 你的意思是 翻译成“任意字符,不是“>”,并且必须至少有一个字符 或者交替地 .*? 也就是说 任何字符,但仅足以使此规则生效 但是不要 使用reg

嗨,伙计们,我对regex很陌生,你能帮我吗

我有一个像这样的字符串,其中
attribute='value'
可以是任何东西,我想做一个
preg\u replace
来得到

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

像这样<代码>预替换(“/”,$replacement,$string)

非常感谢您所拥有的:

.*
将匹配“任何字符,并尽可能多

你的意思是

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

或者交替地

.*?
也就是说 任何字符,但仅足以使此规则生效

但是不要 使用regexps解析HTML是错误的

使用任何现有的html解析器、DOM库、任何东西,只是不要使用幼稚的正则表达式

例如:

 <foo attr=">"> 

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

'<foo attr=" ' with following text of '">' 
“”
这将引导您找到此正则表达式:

 `<[a-zA-Z]+( [a-zA-Z]+=['"][^"']['"])*)>  etc etc 
`
preg_replace(“]*>”,$replacement,$string);
//[^>]表示“除大于符号/右标记括号外的任何字符”

这是非常基本的东西,你应该。:-)

有些人很亲近。。。但不是100%:

这:

preg_replace(“]*>”,$replacement,$string);
应该是这样的:

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

你不希望这是一个贪婪的匹配。

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

preg_replace("/<input.*>/",$replacement,$string);
preg_replace(“//”,$replacement,$string);
您希望我们告诉您,您应该使用$replacement删除匹配的内容*

你必须从另一个角度来考虑这个问题。使用捕获组捕获要保留的内容,并将其重新插入替换内容。例如:

preg_replace("/(<input).*(>)/","$1$2",$string);
preg_replace(“/()/”、“$1$2”、$string);
当然,您不需要在这里捕获组,因为您只需要重新插入文本。如果您想在标记可能变化的情况下执行此操作,请打赌上面显示的技术。这是一个更好的解决方案:

preg_replace("/<input [^>]*>/","<input />",$string);
preg\u replace(“/]*>/”,“”,$string);

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

在大多数文档中,“尽可能多”与“刚好足够”的概念被称为“贪婪”。@John:是的,我知道,但这家伙在这些术语上显然是绿色的;)你在头部爆炸部分是对的。。。从经验上讲,你怎么会认为像“”这样的怪物在HTML中是可能的呢?我知道你们在谈论XSS,但我想我们并不是在讨论一个“如何清理破坏的用户输入?”的问题。允许用户输入HTML本身就是一个很大的WTF。这几乎可以起作用,但它在值中有“>”的属性上失败了,例如:@Adam:这正是你不应该使用正则表达式来解析HTML的原因。有趣的是,在属性值中允许>似乎只是为了反对在HTML上使用正则表达式(我在现实生活中从未见过它). 但这是一个很好的观点。@PHiLho,希望不是在现实生活中使用,但它是人们为XSS目的创建代码的方法之一。很抱歉,属性值中没有“>”字符。从不如果您的HTML中有,那么您将面临一个完全不同的问题。贪婪在这里是不相关的,因为使用[^>]*而不是。*将导致它匹配所有非->字符,直到找到>为止,并且非->字符后跟>的最长(贪婪)和最短(非贪婪)运行在所有情况下都是相同的。
preg_replace("<input[^>]*?>", $replacement, $string);
preg_replace("/<input.*>/",$replacement,$string);
preg_replace("/(<input).*(>)/","$1$2",$string);
preg_replace("/<input [^>]*>/","<input />",$string);