如何匹配以下正则表达式

时间:2019-01-10 17:54:09

标签: php regex tags

我对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>

在上述情况下,没有给出任何匹配。有人可以帮我修复上述正则表达式吗? 谢谢

2 个答案:

答案 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*)

Demo

答案 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