正则表达式查找不以点开头和结尾并仅允许某些特殊字符而不是全部

Rak*_*rma 2 php regex preg-match

我正在尝试匹配一个不是开头的字符串,并且带有(.)点,并允许在字符串中使用一些特殊字符,例如下划线(_)我发现点匹配正则表达式,但无法匹配我所做的特殊字符

preg_match('/^(?![.])(?!.*[.]$).*$/', $str)
Run Code Online (Sandbox Code Playgroud)

不允许

.example
example.
example?ghh. (or some more special char not allowed in string)
Run Code Online (Sandbox Code Playgroud)

允许

 exam.pl56e
    exmple_
    _example_
    exam_ple
Run Code Online (Sandbox Code Playgroud)

所以字符串将是

1. Not start with dot but in the middle can be a dot(.)
2. String Not allow special char (&%$#@) etc. But allow alpha numeric, underscore
3. Not end with dot(.)
Run Code Online (Sandbox Code Playgroud)

它正确匹配开始和结束点,但我需要改进它以不允许所有特殊字符,例如(!&%)等。只允许给定的特殊字符。谢谢

Wik*_*żew 5

您可以使用

'~^(?!\.)[\w.]*$(?<!\.)~'
Run Code Online (Sandbox Code Playgroud)

请参阅正则表达式演示

细节

  • ^- 字符串的开头
  • (?!\.)- a.不能是第一个字符
  • [\w.]* - 0 个或多个字母、数字_.字符(替换*+以匹配字符串中至少 1 个字符以禁止空字符串匹配)
  • $- 字符串结尾
  • (?<!\.)- 最后一个字符不能是.