【问题标题】:find html attributes containing apostrophes using regex (notepad++)使用正则表达式 (notepad++) 查找包含撇号的 html 属性
【发布时间】:2014-01-06 03:43:44
【问题描述】:

已解决(见“justhalf”的第一条评论)

**

我知道,使用 RegEx 来处理 HTML 是邪恶的。

但是,我的手段和技术受到限制,我不知道还能做什么。

情况如下:

我有一个包含大约 5000 个页面的网站。

有一些错误我想修正:

这样的事情: <a href="foo" alt='The queen's attendants ate the cake.' id='yee'>

此示例中的错误是 HTML 属性“alt”的值包含在撇号中,但文本也包含撇号。 这种类型的错误应该有很多。我想把它们都找出来并改正它们。

我用这个模式试了一下:{ [a-zA-Z].*?='[^'].*?'[^=>].*?'}:

即:一个空格,后跟HTML属性名称([a-zA-Z].*?),后跟=和属性值(='[^'].*?')。到这里为止,这应该匹配一个有效的 HTML 属性。 对于一个有效的 HTML 属性,从这里开始的将是一个空格,后跟下一个属性,或者是 HTML 标记的右括号 >。 因此,为了匹配上述错误的 HTML 属性,我使用 ([^=>].*?') 继续搜索模式,即不包含 = 或 > 的字符串,后跟一个 '。换句话说,下一个撇号应该在之前任何=或>符号。

根据我的理解,这个应该排除有效的HTML属性,后面是下一个HTML属性或HTML标签的结束>。 但不知何故,它并没有真正那样工作。

例如,通过这种搜索模式,我可以找到如下内容:

class='noteTag' href='

id='fnt-14' name='

所以...有效的 HTML 属性,然后是下一个。

但我认为这些东西应该被[^=>].*?'排除在外

很困惑。

【问题讨论】:

  • 你应该去掉这些点,你不是故意的。你应该使用[a-zA-Z]*?='[^']*?'[^=>]*?'。因为当您执行[^=>].*? 时,您将匹配不以=> 开头的任何内容,因为.*? 将匹配任何字符串。请注意,例如[a-z]+ 将匹配任何仅由小写字母组成的字符串,而[a-z].+ 将匹配任何以小写字母开头的字符串。
  • 注意[a-zA-Z]*?='[^']*?'[^=>]*?' 将在带有多个单引号的文本(如alt='The queens''' attendants ate the cake.')上失败。您可以尝试使用[a-zA-Z]*?='[^']*'[^=>]*' 来解决此问题。
  • @IvanChau:非常感谢!慢慢地,我开始了解所有这些修饰符及其用途。

标签: html regex notepad++


【解决方案1】:

调整@justhalf 答案:

正则表达式[a-zA-Z]*?='[^']*'[^=>]*' 可用于适应这些模式:

<a href="foo" alt='The queen's attendants ate the cake.' id='yee'>
<a href="foo" alt='The queens''' attendants ate the cake.' id='yee'>
<a href="foo" alt='The queen's attendants ate the cake.' >
<a href="foo" alt='The queen's attendants ate the cake.'>
<a href="foo" id='yee' alt='The queen's attendants ate the cake.'>

注意多个单引号也可以处理。
解释见@justhalf comment

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-29
    • 1970-01-01
    • 1970-01-01
    • 2011-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多