我正在尝试清除大量注入客户博客的垃圾邮件。其中一个问题是,最初进行注入的黑客实际上是以错误的多嵌入链接结束,所以我很难以简洁的方式抓住它们。
我的想法是将posts表中的所有链接转储到文本文件中,然后从该列表中删除有效链接,然后从那里创建一个bash脚本,一次删除一行中的恶意脚本。我试图使用非贪婪的grep来转储链接,否则如果帖子中有多个链接,它将从第一个链接的开头到最后一个链接的结尾。这是我正在使用的那条线:
grep -Po "<a href=[\'\"][^\'\"]*[\'\"]>.*?</a>" wp_posts.sql>full-link-list.txt
当它试图解析嵌入在其他链接中的链接时,问题就出现了。例如,我明白了:
<a href="http://blogtorn.com/images/">where <a href="http://clinesite.com/images/">buy n viagra </a>
来自这样的部分:
<a href="http://blogtorn.com/images/">where <a href="http://clinesite.com/images/">buy n viagra </a> do you buy viagra | buy cialis phentermine | cheap levitra online</a>
虽然并非所有链接都像这样被打破,如果我清除上面命令中的那些输出,我认为这将很难追踪碎片。我认为我需要的是抓住整个块的东西(即匹配开口<a href
与相同数量的闭合</a>
),或者只是最小的内部匹配(即从内部贪婪)然后我在多次通过中做到这一点,但我也对其他建议持开放态度。有什么想法吗?谢谢!
答案 0 :(得分:2)
我认为从内到外的方法是你最好的选择。假设<a>
元素中没有其他标记,则应该像将.*?
更改为[^<>]*
一样简单。而且,正如你所说,多次通过。
虽然在许多正则表达式中可以在一次传递中匹配整个嵌套结构,但每种味道都有不同的含义,并且它总是很难看。