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中使用解决方法吗?
我建议使用"\xFF"
byte 作为模式分隔符,因为它在 UTF-8 字符串中是不允许的,所以我们可以确定它不会出现在模式中。而且因为 preg_match 不理解 UTF-8,所以不会造成任何麻烦。
例子:preg_match("\xFF$pattern\$\xFFADmsu", $subject);
请注意ADmsu
修饰符和添加$
. 该u
修饰符仅在模式中要求有效的 UTF-8 字节,而不在周围的分隔符中要求有效的 UTF-8 字节。
#
如果您使用代替作为/
分隔符,则它是有效的正则表达式。例子:
preg_match('#^('.$pattern.')$#', $value);
Run Code Online (Sandbox Code Playgroud)