允许匹配-特殊字符只能连续出现一次

时间:2018-10-22 07:16:10

标签: php regex

我有一个正则表达式,可以清除所有不需要的字符的字符串。

允许的字符(匹配项)为A-Z a-z 0-9 -/

到目前为止,我所拥有的应该像这样:

$step2 = preg_replace('/[^A-Za-z0-9\-\/]/', '', $step1);

我唯一无法实现的是-只能连续出现一次。

编辑:-的多个实例应仅替换为一个。

3 个答案:

答案 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-