0

我有一个文件名 payment.html.erb

内容有:

<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 字段以及“表单”开始标记和结束标记。

谢谢

4

2 回答 2

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"/>
于 2013-09-29T04:05:32.337 回答
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) }

它可以很容易地修改以删除其他类型的非隐藏标签。

于 2013-09-29T03:11:30.843 回答