【发布时间】: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:非常感谢!慢慢地,我开始了解所有这些修饰符及其用途。