2013-09-29 4 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-поля, а также начальный тег «Form» и закрывающий тег.

благодаря

ответ

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) } 

Update

я неправильно вопрос. Это приведет к удалению всех скрытых входных тегов:

#!/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

Смежные вопросы