我需要替换所有不是字母的起始字符,但我的正则表达式模式正在替换所有字符。我该如何解决这个问题?
$text = "!@#$%^text!@#$%^";
$text = preg_replace("~[^\w]~", "", $text);
echo $text;
结果:
text
需要结果:
text!@#$%^
答案 0 :(得分:6)
问题是你使用的preg_replace
替换了字符串中的所有匹配项,而你只需要在字符串的开头只删除一系列非单词字符。
使用锚点和量词:
$text = preg_replace('~^[^\w]+~', "", $text);
或者使用\W
代替[^\w]
(因为它匹配相同的字符集)以缩短正则表达式:
$text = preg_replace('~^\W+~', "", $text);
请参阅IDEONE demo
说明:
^
- 字符串开头[^\w]+
- 除了单词(*
)字符以外的1个或多个字符([a-zA-Z0-9_]
)。要匹配数字和非单词字符,只需创建字符类 [\W\d]
:
'~^[\W\d]+~'
字符类将匹配\W
(非单词字符)或\d
(数字),1次或多次(由于+
)。