Вы должны использовать синтаксический анализатор для управления 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"/>
YEAH! но вы можете сделать это в регулярном выражении: P приятная работа. –
Его довольно тривиально, но в чем смысл? – Jay
Обязательный комментарий о том, как это провалится при заданном корректном HTML и использовании надежного анализатора, может быть хорошей идеей. – Max