我对Regex真的很陌生,但我仍在尝试了解它的工作方式。我正在尝试开发一个正则表达式来从HTML的输入标签中捕获名称和值。
<input type='hidden' name='student' value='9208'>
我的想法是提取与姓名(学生)和值(9208)相关的值。 我基于stakcoverflow中针对先前问题的较早答案开发了以下正则表达式。
/<(input)(?:\s+type=([\'"]?)(?<type>[^\'"]*?)\2\s*)?(?:\s+name=([\'"]?)(?<name>[^\'"]*?)\4\s*)?(?:\s+value=([\'"]?)(?<value>[^\'"]*?)\4\s*)?>/m
正则表达式上方的输入正常工作
<input type='hidden' name='student' value='9208'>
但是,如果在与value属性( value ='9208')相对应的值周围没有单引号或双引号,则不会捕获字符串。 例如-
<input type='hidden' name='student' value=9208>
在上述情况下,没有给出任何匹配。有人可以帮我修复上述正则表达式吗? 谢谢
答案 0 :(得分:0)
您的正则表达式中有一个小问题。
<(input)(?:\s+type=([\'"]?)(?<type>[^\'"]*?)\2\s*)?(?:\s+name=([\'"]?)(?<name>[^\'"]*?)\4\s*)?(?:\s+value=([\'"]?)(?<value>[^\'"]*?)\4\s*)?>
如果您注意到,在此正则表达式部分(?<value>[^\'"]*?)\4\s*)
中,您使用\4
作为右引号或双引号,但是\4
是名称正则表达式部分{{1 }},因此,如果value属性也用相同的字符,双引号或单引号引起来,则您的正则表达式将匹配良好,但如果name属性的值被与value属性部分不同的内容包围,则您的正则表达式将根本不匹配。 / p>
因此,您只需要稍作修改,然后在(?<name>[^\'"]*?)\4\s*)
部分对其进行\6
,则您的正则表达式将开始按预期进行匹配。
这是您应该使用的正确正则表达式,
(?<value>[^\'"]*?)\4\s*)
答案 1 :(得分:0)
我同意您对帖子的评论,即使用正则表达式解析HTML不是一个好主意。 但这仍然是可能的,尽管它要求您非常准确和细心。
在您的情况下,正则表达式可以如下所示(出于可读性,我将其划分为大块):
<(input)
-<
和第一个捕获组,与标签名称匹配。(?:\s+type=([\'"]?)(?<type>[^\'"]+)\2)?
-type
属性的一部分。(?:\s+name=([\'"]?)(?<name>[^\'"]+)\4)?
-name
属性的一部分。(?:\s+value=([\'"]?)(?<value>[^\'"]+)\6)?
-value
属性的一部分。\s*>
-一系列空格和>
终止标签。您的失败之处在于,在与value
有关的部分中,您叫第4组
但是您应该给第6组打电话。
另一个修正是,如果下一组以\s+
开头,则当前组
分组讨论不必以\s*
结尾(就像您一样)。
有关工作示例,请参见https://regex101.com/r/IOLKTV/1