如何在HTML源码中匹配dd.mm.yyyy格式日期?正则失效问题
你的正则表达式无法匹配HTML中日期的核心原因是开头的^锚点限制了匹配范围。
让我们拆解一下你的正则:
^\s*(3[01]|[12][0-9]|0?[1-9])\.(1[012]|0?[1-9])\.((?:19|20)\d{2})\s*
其中^表示字符串(或行,取决于正则模式)的起始位置,这意味着你的正则只会匹配那些从字符串开头就开始的日期。但在你的HTML代码里,日期是嵌入在更长的文本片段中的,比如:
<time ...>30.05.2018 à 10h44</time>
这里的30.05.2018前面并没有到字符串的起始位置(前面有<time>标签的内容),后面还跟着 à 10h44,所以^锚点直接导致正则无法匹配到目标日期。
至于你提到的能匹配"ajhajashsja 31.05.2018",我猜测可能是你测试时不小心去掉了^锚点,或者测试环境的正则模式默认忽略了行首锚点?正常情况下,带^的正则是无法匹配这个字符串的,因为字符串开头是字母而非日期。
修正后的正则
去掉开头的^,同时可以添加单词边界\b来确保我们匹配的是独立的日期(避免误匹配类似123.45.6789这种包含数字点的非日期内容):
\b(3[01]|[12][0-9]|0?[1-9])\.(1[012]|0?[1-9])\.((?:19|20)\d{2})\b
这个正则会匹配任何独立存在的dd.mm.yyyy格式日期,无论它在文本的哪个位置,正好适合你从HTML文本中提取日期的需求。
额外提示
如果你是直接处理HTML内容,其实更稳妥的方式是通过解析HTML DOM来提取<time>标签的文本内容或datetime属性值,而不是用正则匹配——正则处理HTML容易出现各种边缘情况(比如标签嵌套、特殊字符转义等)。比如你可以直接获取<time>元素的textContent,再从中提取日期,或者直接读取datetime属性(里面的日期格式更规范,是YYYY-MM-DD格式,更容易处理)。
内容的提问来源于stack exchange,提问作者Lucien S.

