2012-04-25 105 views
1

我有一个巨大的Wordpress XML导出。不幸的是,一些混蛋设法将代码注入到安装中并将DIV注入到内容中。 现在我想清理那些混乱。这里是什么样子:如何从XML文件中删除具有样式属性的DIV标签?

<p>Normal Text</p> 
<div style="position:absolute;top:-9660px;left:-4170px;"><a href="http://insane.link.com">Insane Linktext</a></div> 
<div style="position:absolute;top:-2460px;left:-5370px;"><a href="http://insane.link.com">Another Insane Linktext</a></div> 
<p>Normal good people's brains' text</p> 

我想过使用一些正则表达式表达式匹配包含STYLE属性的DIV。可用的工具是Aptana或其他文本编辑器,PHP服务器以及OSX终端。对此有何建议?

感谢和干杯!

回答

0

这可以帮助你:这将匹配您在上面提供的div:

<div style="[a-zA-Z0-9-:;]+"><a href="[a-z:/.]+">[a-zA-Z ]+</a></div> 

然而,它只会匹配div > a > text模式,只有div的有一个样式属性,别无其他。

你应该能够做一个查找和替换使用大多数HTML编辑器(Dreamweaver和记事本++都允许的话)

+0

啊,这是正确的做法,发现已经有一些。但标记有时会有所不同,所以我可以只匹配DIV而不是As。我试过'

('.*?')
' - 但是没有找到任何东西。 – cukabeka 2012-04-25 09:35:30

+0

好吧,我刚刚找到了适合我的解决方案:'

.*
'使用Editra编辑器。感谢您指引我进入这个方向! – cukabeka 2012-04-25 09:47:28

+2

我必须发布关于正则表达式和XML的强制性健康警告http://stackoverflow.com/a/1732454/169346 – JeremyP 2012-04-25 10:06:53

2

我建议不使用正则表达式,但使用一个真正的XML解析器。例如,因为你是在OS X上,因此具有安装了Ruby已经可以清理你的HTML:

require 'nokogiri'      # Use `sudo gem install nokogiri` first 
html = Nokogiri.HTML(IO.read(ARGV[0])) # read and parse the HTML document 
html.css('div[style]').remove   # destroy all <div style="...">...</div> 
File.open(ARGV[1],'w'){ |f| f << html } # write the html to disk as a new file 

首先,您需要为每个注释安装引入nokogiri。

然后,将上面的内容保存为“clean_divs.rb”,然后键入ruby clean_divs.rb my.html my_fixed.html(其中第一个是要读取的文件的名称,第二个是要写入的文件的名称)。

如果您希望在销毁时更加精确,可以使用XPath选择要销毁的元素,例如, html.xpath('//div[@style][a]').remove只能找到具有style属性的div和直接子元素<a>

+0

感谢您的教程,我首选使用编辑器,但我保存下一次。 – cukabeka 2012-04-25 09:48:58

0

你可以为了使用修改identity transform为那些<div>元素的空模板将其删除:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

    <!--default processing for content is to copy forward --> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <!--remove the rogue div elements --> 
    <xsl:template match="div[@style]" /> 

</xsl:stylesheet> 
+0

不幸的是,我不知道如何应用XSL转换。我是否使用编辑器,浏览器或服务器进行转换? – cukabeka 2012-04-25 09:32:45