2012-04-25 108 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