替换正则表达式中不是字母的所有起始字符
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);
解释:
^
- 字符串开头
[^\w]+
- 除了单词 ([a-zA-Z0-9_]
) 字符之外的 1 个或多个字符 (*
)。
要同时匹配数字和非单词字符,只需创建一个 字符 class [\W\d]
:
'~^[\W\d]+~'
这是一个regex demo
字符 class 将匹配 \W
(非单词字符)或 \d
(数字),1 次或多次(由于 +
) .
我需要替换所有 开头的 不是字母的字符,但我的正则表达式模式正在替换 所有 字符。我该如何解决这个问题?
$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);
解释:
^
- 字符串开头[^\w]+
- 除了单词 ([a-zA-Z0-9_]
) 字符之外的 1 个或多个字符 (*
)。
要同时匹配数字和非单词字符,只需创建一个 字符 class [\W\d]
:
'~^[\W\d]+~'
这是一个regex demo
字符 class 将匹配 \W
(非单词字符)或 \d
(数字),1 次或多次(由于 +
) .