Regex для проверки содержимого между тегами HTML - PullRequest
1 голос
/ 10 сентября 2011

Я изо всех сил пытаюсь найти RegEx, который подтвердит наличие некоторого текста между двумя тегами.В частности, я хочу убедиться, что текст «ВСЕГО» и «19,00 $» можно найти в одной и той же строке таблицы.

Я не планирую вкладывать таблицы, поэтому я не беспокоюсь о вложенныхсовпадают, но я хочу убедиться, что мой текст находится в пределах ЖЕ tr

Мой HTML:

<tr style='text-align:right;'>
  <td>shipping:</td>
  <td style='padding-left:3em;'>$17.00</td>
</tr>
<tr style='text-align:right;'>
  <td>TOTAL:</td>
  <td style='padding-left:3em;'>$19.00</td>
</tr>

Регулярное выражение, которое я пробовал:

/<tr\b[^>]*>(.*?)<\/tr>/m

Это близко, вторая группа захвата имеет мой контент.Что мне нужно изменить, чтобы сопоставлялась только вторая группа захвата?

С ней можно поиграть на Rubular здесь

Ответы [ 2 ]

2 голосов
/ 11 сентября 2011

Я думаю, что парсер HTML и немного XPath были бы лучшим вызовом, чем регулярное выражение.Примерно так:

shipping = '//td[normalize-space(text())="shipping:"]/following-sibling::td[normalize-space(text())]'
total    = '//td[normalize-space(text())="TOTAL:"]/following-sibling::td[normalize-space(text())]'
doc = Nokogiri::HTML <<HTML
  <tr style='text-align:right;'>
    <td>  shipping:    </td>
    <td style='padding-left:3em;'>$17.00</td>
  </tr>
  <tr style='text-align:right;'>
    <td>TOTAL:</td>
    <td style='padding-left:3em;'>$19.00</td>
  </tr>
HTML
has_shipping = doc.xpath(shipping).count == 1 # true
has_total    = doc.xpath(total   ).count == 1 # true

Но без $17.00 и $19.00:

doc = Nokogiri::HTML <<HTML
  <tr style='text-align:right;'>
    <td>  shipping:    </td>
    <td style='padding-left:3em;'>    </td>
  </tr>
  <tr style='text-align:right;'>
    <td>TOTAL:</td>
    <td style='padding-left:3em;'></td>
  </tr>
HTML
has_shipping = doc.xpath(shipping).count == 1 # false
has_total    = doc.xpath(total   ).count == 1 # false

Если вы хотите также проверить формат цены, то вы можете найти просто<td> s, которые вы хотите, и применяйте любые перечисляемые методы, которые имеют смысл в вашей ситуации:

shipping = '//td[normalize-space(text())="shipping:"]/following-sibling::td'
good_one = doc.xpath(shipping).count { |n| n.content =~ /\A\s*\$\d+\.\d{2}\s*\z/ } == 1
2 голосов
/ 10 сентября 2011
<tr.*?>\s*?<td.*?>TOTAL:<\/td>\s*?<td.*?>\$19\.00<\/td>\s*?<\/tr>
...