我想使用php正则表达式删除html中的所有属性,如:title =“...”id =“...”class =“...”excel href
我使用$result = preg_replace('#[^(href)]="(.*?)"#is', '', $result);
但错了
在线测试
http://www.phpliveregex.com/p/dcn
答案 0 :(得分:0)
你真的应该考虑使用SGML parser进行这类工作。正则表达式不适合HTML处理。但是,如果它们是您可以使用的唯一内容,则需要了解有关语法的更多信息。至少有一个问题是子表达式[^(href)]
,它指的是character class。这匹配(
,h
,r
,e
,f
和{{1}中不的单个字符}}。这可能不是你想要的。
您可以尝试使用带有反向引用的negative look-ahead,但最终可能会咀嚼您不想要的东西,或者缺少您想要的东西。请考虑以下HTML-ish片段:
)
您需要能够告诉您何时输入了标签(因此我建议使用SGML解析器),并且如何确保使用负面预测来替换正确的字符串并不明显。< / p>
preg_replace_callback
可能更适合您的使用案例(即,使用您的<p class="...">Properties like <a class="..." href="..."
name="...">href="..."</a> and <a href="..."
name="...">name="..."</a> should come after the <a
and before the >.</p>
<p class="..."><a name="..." href="..."><img
src="..." /></a><br class="..." />Fig. 1</p>
保留您的$callback
属性,但过滤其他所有内容):
href
可能有一种比上面更简单的方法来实现同样的目的,但你应该能够理解。顺便说一下,通过上面的代码运行上面的HTML-ish片段可以得到:
$filtered = preg_replace_callback('#<([^/\s]\S*)((?:\s+[^>=]+=(?:\'[^\']*\'|"[^"]*"))*)(\s*/?)>#is',
function ($matches) {
$filtered = preg_replace_callback('#\s+([^=]+)=(?:\'[^\']*\'|"[^"]*")#is',
function ($matches) {
return ($matches[1] != 'href'
? ''
: $matches[0]);
}, $matches[2]);
return ('<' . $matches[1] . $filtered . $matches[3] . '>');
}, $subject);
根据您的学习风格,这些教程中的一个或多个可能会有所帮助: