【问题标题】:Retriving xml/html attibute - double and single quote issue检索 xml/html 属性 - 双引号和单引号问题
【发布时间】:2013-04-23 11:55:29
【问题描述】:

代码

我有这个正则表达式:

data-([a-zA-Z_]+[0-9]*)=[\"']([a-zA-Z0-9_ ]*)[\"']

电流输出

如果我有这个输入:

<div data-foo="bar">

匹配项是:

  • data-foo="bar"
  • 酒吧

但是如果我给出这个输入:

<div data-foo="ba'r">

那么匹配项是:

  • data-foo="ba'

期望的输出

如果我有这个输入:

<div data-foo="ba'r">

那我就不匹配了:

  • data-foo="ba'r"
  • ba'r

【问题讨论】:

  • 大多数网络语言都有内置的 HTML 解析器。诉诸正则表达式是一条危险的道路。
  • 如果你正在创建一个,如果不使用正则表达式你会怎么做?
  • 状态机?硬编码规则? (我真的不知道。词法分析超出了我的专业领域。)

标签: regex


【解决方案1】:

请注意,您可以使用支持 pcre 的语言(php、ruby、java...)来执行此操作。 一个带有 php 语法的示例(带有反向引用):

$pattern = "~data-([a-zA-Z_]+\d*)=([\"'])(.*?)\2~";

但是通过这种方法,您获得了不需要的报价。

另一种方式:

 $pattern = "~data-([a-zA-Z_]+\d*)=(?|'([^']++)'|\"([^\"]++)\")~";

使用(?|...|...|...) 功能时,您允许正则表达式引擎为不同的捕获组提供相同的编号。因此,您可以准确地获得您想要的,没有寄生虫匹配。

【讨论】:

  • 这解决了我在使用其他字符时遇到的一个新问题,例如 åäö.. 我正在使用 c++ btw
  • 使用 pcre 正则表达式,您可以使用 \p{L} 字符类来匹配您想要的所有字母(也带有重音字符)。这可能很有用(但在这种情况下不是)
【解决方案2】:

添加要查找的所需字符 [a-zA-Z0-9_\"'] --> 注意我还添加了 " 和 '

【讨论】:

    【解决方案3】:

    '\' 是为了跳过引号?

    也许,如果你同时跳跃

    数据-([a-zA-Z_]+[0-9]*)=[\"\']([a-zA-Z0-9_ ]*)[\"\']

    如果你需要内容有引号,你需要使用 - \' 或 \" 或 \'" 进入引号之间的组 - 这样你现在可以将其他字符放在一起。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-11
      • 1970-01-01
      • 1970-01-01
      • 2019-05-05
      • 2020-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多