允许空格、unicode 字母、数字、下划线、破折号和逗号吗?

Allow whitespace, unicode letters, digits, underscore, dash AND comma?

我对这个主题很陌生 preg,我正在使用这个 preg_match 条件来检查用户是否输入了空格、unicode 字母、数字、下划线或破折号:

if(preg_match("/[^0\pL\pN_-]/u", $term)) {

但现在我想允许一个逗号。所以我尝试了这个:

if(preg_match("/[^0\pL\pN,_-]/u", $term)) {

它确实有效,我只是想知道为什么。我只是想更好地理解它。为什么必须是 ,_- 而不是 -_, 才能允许逗号?

如果有人能逐步向我解释这一点,我将不胜感激。

这是因为 - 用于方括号中的范围([] -> 字符 类)。从 manual 开始:indicates character range,例如:0-9a-z.

所以只要你把它放在最后就可以了,不必转义它。在所有其他情况下,您必须使用反斜杠将其转义,例如\-.

表示:

,_-  //At the end
_,-  //At the end
\-,_ //Escape it
\-_, //Escape it
,\-_ //Escape it
_\-- //Escape it

当我们在括号内或使用字符 class 时,- 表示字符范围,如 [a-z]。因此,如果您在字符 class 末尾以外的任何地方放置破折号,它不会被解释为文字破折号,而是作为字符范围指示符。