首页 > 解决方案 > 给定一个 HTML 字符串,查找浮动 < > 的最佳方法是什么

问题描述

给定一个 HTML 字符串:

myhtml = "<title> my title </title>"

true如果存在浮动/未转义的<or>以及有问题的字符本身,我该如何编写一个返回的函数?例子:

myhtml = "<title> my title </title>"
hasFloating(myhtml) => false

myhtml = "<title> < </title>"
hasFloating(myhtml) => true, <

myhtml = "<title> > </title>"
hasFloating(myhtml) => true, >

请记住,这个字符串可能是一段巨大的 HTML 代码,其中包含多个元素。我也可以使用一个函数检查是否存在未转义字符,第二个函数返回违规字符本身

编辑:为了记录,我也在mechanize这个项目中使用 gem

标签: rubymechanize

解决方案


如果您只想检查是否有未闭合的尖括号,则不需要花哨的宝石。
你可以只使用StringScanner.

require 'strscan'

def has_floating(html)
  open_angle = 0
  scanner = StringScanner.new(html)
  while scanner.scan(/<|>/)
    case scanner.matched
    when '<'
      return [true, '<'] if open_angle == 1
      open_angle += 1
    when '>'
      return [true, '>'] if open_angle == 0
      open_angle -= 1
    end
    scanner.scan_until(/[^<>]+/)
  end
  return false
end

myhtml = "<title> my title </title>"
puts has_floating(myhtml).inspect
#=> false

myhtml = "<title> < </title>"
puts has_floating(myhtml).inspect
#=> [true, "<"]

myhtml = "<title> > </title>"
puts has_floating(myhtml).inspect
#=> [true, ">"]

推荐阅读