在HTML5模式输入元素属性上使用什么是安全的PCRE正则表达式分隔符?

Dav*_*eid 12 php regex html5 pcre

似乎HTML5规范(以及因此ECMA262)允许<input type="text" pattern="[0-9]/[0-9]" />匹配字符串'0/0',即使正斜杠没有被转义.像Drupal这样的Web应用程序希望为不支持HTML5的浏览器提供服务器端验证,例如:

<?php
preg_match('/^(' . $pattern . ')$/', $value);
?>
Run Code Online (Sandbox Code Playgroud)

不幸的是,字符串'[0-9]/[0-9]'不是有效的PRCE正则表达式.似乎大多数(如果不是全部)支持HTML5的浏览器都支持这两者pattern="[0-9]/[0-9]" 并且 pattern="[0-9]\/[0-9]"引发了一个问题 - 我们可以使用什么作为分隔符来运行这种模式来对抗Perl风格的正则表达式?

我们已针对W3C规范提交了错误报告,但这里的浏览器是错误的吗?是否需要澄清HTML5规范?我们可以在PHP中使用解决方法吗?

Jos*_*ner 5

我建议使用"\xFF"byte 作为模式分隔符,因为它在 UTF-8 字符串中是不允许的,所以我们可以确定它不会出现在模式中。而且因为 preg_match 不理解 UTF-8,所以不会造成任何麻烦。

例子:preg_match("\xFF$pattern\$\xFFADmsu", $subject);

请注意ADmsu修饰符和添加$. 该u修饰符仅在模式中要求有效的 UTF-8 字节,而不在周围的分隔符中要求有效的 UTF-8 字节。


Ale*_*rge 4

#如果您使用代替作为/分隔符,则它是有效的正则表达式。例子:

preg_match('#^('.$pattern.')$#', $value);
Run Code Online (Sandbox Code Playgroud)