正则表达式匹配字母数字字符,下划线,句点和破折号,只允许点和破折号在中间

ban*_*skt 5 php regex preg-match

目前,我正在使用这个:

if (preg_match ('/^[a-zA-Z0-9_]+([a-zA-Z0-9_]*[.-]?[a-zA-Z0-9_]*)*[a-zA-Z0-9_]+$/', $product) ) {
return true;
} else { 
return false
}
Run Code Online (Sandbox Code Playgroud)

例如,我想匹配:

  1. pro.duct-name_
  2. _pro.duct.name
  3. p.r.o.d_u_c_t.n-a-m-e

但我不想匹配:

  1. pro..ductname
  2. .productname-
  3. -productname.
  4. -productname

Wal*_*oss 9

答案是

/^[a-zA-Z0-9_]+([-.][a-zA-Z0-9_]+)*$/
Run Code Online (Sandbox Code Playgroud)

如果只允许字符串包含.--.不匹配.无论如何,你为什么要让它们匹配?但是如果你真的需要这些字符串来匹配,那么可能的解决方案就是

/^[a-zA-Z0-9_]+((\.(-\.)*-?|-(\.-)*\.?)[a-zA-Z0-9_]+)*$/
Run Code Online (Sandbox Code Playgroud)

单个.-第一个正则表达式由交替序列替换,.并且分别-以任一个.-任选后续-..-成对开始,任选地随后是-.分别对应,以允许偶数个交替的字符.这种复杂性可能是一种过冲,但目前的规范似乎需要这种复杂性.如果2交替的最大.-是必需的,正则表达式变为

/^[a-zA-Z0-9_]+((\.-?|-\.?)[a-zA-Z0-9_]+)*$/
Run Code Online (Sandbox Code Playgroud)

在这里这里测试