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

Replacing all starting characters that isn't a letter in regex

我需要替换所有 开头的 不是字母的字符,但我的正则表达式模式正在替换 所有 字符。我该如何解决这个问题?

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

echo $text;

结果:

text

需要结果:

text!@#$%^

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

使用锚点和量词:

$text = preg_replace('~^[^\w]+~', "", $text);

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

$text = preg_replace('~^\W+~', "", $text);

IDEONE demo

解释:

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

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

'~^[\W\d]+~'

这是一个regex demo

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