替换正则表达式中不是字母的所有起始字符

jes*_*ica 1 php regex preg-replace

我需要替换所有不是字母的起始字符,但我的正则表达式模式正在替换所有字符.我该如何解决?

$text = "!@#$%^text!@#$%^";
$text = preg_replace("~[^\w]~", "", $text);

echo $text;
Run Code Online (Sandbox Code Playgroud)

结果:

text
Run Code Online (Sandbox Code Playgroud)

需要结果:

text!@#$%^
Run Code Online (Sandbox Code Playgroud)

Wik*_*żew 6

问题是你正在使用preg_replace它替换字符串中的所有匹配项,而你只需要在字符串的开头只删除一系列非单词字符.

使用锚点和量词:

$text = preg_replace('~^[^\w]+~', "", $text);
Run Code Online (Sandbox Code Playgroud)

或者使用\W而不是[^\w](因为它匹配同一组字符)来缩短正则表达式:

$text = preg_replace('~^\W+~', "", $text);
Run Code Online (Sandbox Code Playgroud)

请参阅IDEONE演示

说明:

  • ^ - 字符串的开头
  • [^\w]+- *除了单词([a-zA-Z0-9_])字符以外的1个或多个字符().

要匹配数字和非单词字符,只需创建一个字符类 [\W\d]:

'~^[\W\d]+~'
Run Code Online (Sandbox Code Playgroud)

这是一个正则表达式演示

字符类将匹配\W(非单词字符)或\d(数字),1次或多次(由于+).