php正则表达式删除所有attibute除了href中的href

时间:2015-10-13 03:14:38

标签: php regex preg-replace

我想使用php正则表达式删除html中的所有属性,如:title =“...”id =“...”class =“...”excel href 我使用$result = preg_replace('#[^(href)]="(.*?)"#is', '', $result);但错了 在线测试 http://www.phpliveregex.com/p/dcn

1 个答案:

答案 0 :(得分:0)

你真的应该考虑使用SGML parser进行这类工作。正则表达式不适合HTML处理。但是,如果它们是您可以使用的唯一内容,则需要了解有关语法的更多信息。至少有一个问题是子表达式[^(href)],它指的是character class。这匹配(href和{{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 &lt;a and before the &gt;.</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);

根据您的学习风格,这些教程中的一个或多个可能会有所帮助: