2013-09-29 25 views
0

我有一個文件名payment.html.erb如何從HTML文件中刪除特定的數據線與紅寶石

內容有:

<form method="POST" action="http://www.example.com" id="my_id" class="form"> 
<input type="hidden" name="Timestamp" value="2013-09-29T08:05:14.Z"/> 
<input type="hidden" name="Signature" value="dd01adafd2689b243d6cbc9088da2bf699976eb0"/> 
<input type="hidden" name="Amount" value="1"/> 
<input type="text" name="AccountName" value="" placeholder="account name"/> 
<p></p> 
<select name="ExpireMonth"> 
    <option value="8">8</option> 
    <option value="9">9</option> 
    <option value="10">10</option> 
    <option value="11">11</option> 
    <option value="12">12</option> 
</select> 
<select name="ExpireYear"> 
    <option value="2017">2017</option> 
    <option value="2018">2018</option> 
    <option value="2019">2019</option> 
    <option value="2020">2020</option> 
</select> 
<input type="submit" class="yyy" id="xxx" value="submit"/> 
</form> 

我從文件中讀取,並再次需要寫回文件(我已經編碼)

我想刪除所有非隱藏的html字段,也'表'開始標記和結束標記。

感謝

回答

1
  1. 文件讀入到一個字符串。
  2. 使用gsub()刪除不需要的標籤。
  3. 將字符串寫入文件。

#!/usr/bin/env ruby 

file_name = 'payment.html.erb' 
data = IO.read(file_name) 
data.gsub!(/<input.*type="hidden".*>/, '') 
data.gsub!(/<form.*>/, '') 
data.gsub!(/<\/form>/, '') 
File.open(file_name, 'w') {|f| f.write(data) } 

更新

我誤解了問題。這將刪除所有未隱藏的輸入標籤:

#!/usr/bin/env ruby 

file_name = 'payment.html.erb' 
data = IO.read(file_name) 
copy = String.new(data) 
copy.scan(/<input.*>/) { |tag| 
    data.gsub!(tag, '') if !tag.include?("type=\"hidden\"") 
} 
data.gsub!(/<form.*>/, '') 
data.gsub!(/<\/form>/, '') 
File.open(file_name, 'w') {|f| f.write(data) } 

它可以很容易地修改爲刪除其他類型的非隱藏標籤。

+0

YEAH!但是你可以用正則表達式:P很好的工作。 –

+0

它相當平凡,但有什麼意義? – Jay

+0

當給定某些有效的HTML並使用健壯的解析器時,如何失敗可能是一個好主意。 – Max

3

您應該使用解析器來操縱HTML或XML,除非內容不重要,並且您完全控制它。如果你不擁有它,或者它不是微不足道的,那麼如果它有可能會出現太多錯誤,這會導致你的代碼崩潰,或者崩潰,或者弄亂標記。我想使用Nokogiri。這對XML和HTML一個很好的解析器,並且可以使你試圖做什麼短期工作:

html =<<EOT 
<form method="POST" action="http://www.example.com" id="my_id" class="form"> 
<input type="hidden" name="Timestamp" value="2013-09-29T08:05:14.Z"/> 
<input type="hidden" name="Signature" value="dd01adafd2689b243d6cbc9088da2bf699976eb0"/> 
<input type="hidden" name="Amount" value="1"/> 
<input type="text" name="AccountName" value="" placeholder="account name"/> 
<p></p> 
<select name="ExpireMonth"> 
    <option value="8">8</option> 
    <option value="9">9</option> 
    <option value="10">10</option> 
    <option value="11">11</option> 
    <option value="12">12</option> 
</select> 
<select name="ExpireYear"> 
    <option value="2017">2017</option> 
    <option value="2018">2018</option> 
    <option value="2019">2019</option> 
    <option value="2020">2020</option> 
</select> 
<input type="submit" class="yyy" id="xxx" value="submit"/> 
</form> 
EOT 

require 'nokogiri' 

doc = Nokogiri::HTML::DocumentFragment.parse(html) 

doc.css('input[type!="hidden"]').remove 

form_contents = doc.at('form').children 
doc.at('form').replace(form_contents) 

puts doc.to_html 

運行輸出:

<input type="hidden" name="Timestamp" value="2013-09-29T08:05:14.Z"><input type="hidden" name="Signature" value="dd01adafd2689b243d6cbc9088da2bf699976eb0"><input type="hidden" name="Amount" value="1"><p></p> 
<select name="ExpireMonth"><option value="8">8</option> 
<option value="9">9</option> 
<option value="10">10</option> 
<option value="11">11</option> 
<option value="12">12</option></select><select name="ExpireYear"><option value="2017">2017</option> 
<option value="2018">2018</option> 
<option value="2019">2019</option> 
<option value="2020">2020</option></select> 

解析器如引入nokogiri可以處理,如果沒有問題。

另外,解析器可以處理這個有效的標記:

<input 
    type="text" 
    name="AccountName" 
    value="" 
    placeholder="account name" 
/> 

嘗試使用正則表達式和gsub剝離這樣或那樣:

<input type="text"name="AccountName"value="<your name goes here>"placeholder="account name"/> 
+0

謝謝:) .............. – akdev