PHP 正则表达式 : zero or more whitespace not working

标签 php regex symfony

我正在尝试将正则表达式约束应用于 Symfony 表单输入。输入的要求是字符串的开头和所有逗号必须后跟零个或多个空格,然后是 #@ 符号,除非它是空的字符串。

据我所知,没有办法告诉约束使用 preg_match_all 而不仅仅是 preg_match,但它确实有能力否定匹配.因此,我需要一个 preg_match 不会匹配给定场景的正则表达式:任何包含字符串开头或逗号的字符串,后跟零个或多个空格,后跟任何字符这不是 # 或 @,也不是字符串的结尾,但会匹配其他所有内容。下面是几个例子:

preg_match(..., '');              // No match
preg_match(..., '#yolo');         // No match
preg_match(..., '#yolo,  #swag'); // No match
preg_match(..., '#yolo,@swag');   // No match
preg_match(..., '#yolo, @swag,'); // No match

preg_match(..., 'yolo');        // Match
preg_match(..., 'swag,#yolo');  // Match
preg_match(..., '@swag, yolo'); // Match

我肯定认为 /(^|,)\s*[^@#]/ 会起作用,但它在每种情况下都失败了,有 1 个或多个空格,它出现是因为星号。如果我去掉星号,preg_match('/(^|,)\s[^@#]/', '#yolo, @swag') 不匹配(根据需要)只有一次空间,但只要我重新引入星号,它就会因任何数量的空间 > 0 而中断。

我的理论是正则表达式引擎将第二个空格解释为不在字符集 [@#] 中的字符,但这只是一个理论,我不知道该怎么做做吧。我知道我可以创建一个自定义约束来使用 preg_match_all 来解决这个问题,但我想尽可能避免这种情况。

最佳答案

你可以使用

'~(?:^|,)\s*+[^#@]~'

这里,+ 符号定义了一个*+ possessive quantifier匹配 0 次或多次出现的空白字符,如果 [^@#] 无法匹配后续字符,则不允许正则表达式引擎回溯到 \s* 模式。

参见 regex demo .

详情

  • (?:^|,) - 字符串开头或 ,
  • \s*+ - 零个或多个空白字符,所有格匹配(即,如果下一个字符不与 [^#@] 模式匹配,整个模式匹配将失败)
  • [^@#] - 匹配除 @# 之外的任何字符的否定字符类。

关于PHP 正则表达式 : zero or more whitespace not working,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49618161/

相关文章:

php - WordPress:get_option 检索数组

symfony - Doctrine querybuilder 结果

php - 无需登录的 Symfony2 安全设置

symfony - 动态改变记住我cookie的生命周期

php - 大数据如何提高MYSQL查询性能?

java - Java 中 PHP 的 gzuncompress 函数?

php - 如何使用php在不同主机上使用多个数据库?

正则表达式 (PCRE) : Match all digits conditional upon presence of a string

r - If else 语句检查字符串是否包含 R 中的子字符串

python - re.findall - 从逗号分隔的字符串中获取项目列表