我有一个正则表达式,可以清除所有不需要的字符的字符串。
允许的字符(匹配项)为A-Z
a-z
0-9
-
和/
到目前为止,我所拥有的应该像这样:
$step2 = preg_replace('/[^A-Za-z0-9\-\/]/', '', $step1);
我唯一无法实现的是-
只能连续出现一次。
编辑:-
的多个实例应仅替换为一个。
答案 0 :(得分:2)
在单个正则表达式中执行此操作的方法是将8.0.12
捕获到重复的组(可能存在或可能不存在)中,并与其他否定字符集交替出现。替换为第一个捕获的组(如果匹配SN
,则为-
,否则为空字符串)。
还请注意,-
简化为-
,阅读起来会更好一些。此外,重复否定字符集将使操作更有效率-这样,如果一行中要替换多个字符,则只需在其中替换一个即可,而不是替换每个字符。
0-9
输出:
\d
答案 1 :(得分:1)
假设您要删除所有特殊字符,同时最多允许一个连字符,请尝试以下操作:
$step2 = preg_replace('/[-]+/', '-', preg_replace('/[^A-Za-z0-9\-\/]/', '', $step1));
这只是单独进行第二次替换,以将多个破折号出现(例如----
)折叠为一个破折号。
答案 2 :(得分:1)
另一种选择是将具有模式和替换的数组传递到preg_replace。
第一个模式[^A-Za-z0-9/-]
将匹配字符类中未包含的内容,并将其替换为空字符串。第二个模式将匹配-
的2倍以上,并将其替换为单个-
。
$step1 = "This is a --- test with-----a dash-.";
$step2 = preg_replace(array('~[^A-Za-z0-9/-]~','~-{2,}~'), array('', '-'), $step1);
echo $step2; // Thisisa-testwith-adash-