3

我想替换字符串中的所有非数字字符,除了+.

我已经尝试过这个问题,但它不起作用......

这是我目前所拥有的:

$nn = preg_replace("/([^0-9\/+]+)/", "", $string );

它可以 100% 工作,除了以+任何方式删除...

编辑

我的输入将始终只包含 1 +,如果有更多,它们应该被删除。

基本上,如果用户输入电话号码,(015) 234-2634它应该返回+27152342634(南非国家代码 - 我在稍后阶段添加 +27)但是如果+27 (15) 234-2634输入,+27152342634应该返回。

4

3 回答 3

12

您应该可以使用以下正则表达式来做到这一点:

[^0-9+]

preg_replace()

$nn = preg_replace('/[^0-9+]/', '', $string);

您当前的正则表达式还保留一个正斜杠,因此要保留该功能:

$nn = preg_replace('/[^0-9\/+]/', '', $string);

带输出的示例代码:

<?php
$string = '+27 (15) 234-2634';
$nn = preg_replace("/[^0-9+]/", "", $string );
echo $nn . "\n";
?>

结果是:

+27152342634

更新(只保留第一个匹配+
根据您最新的问题更新,您也只想保留找到的第一个 +符号。为此,由于可能没有关于第一个符号位置的“规则”(例如“它必须是字符串中的第一个字符),我建议使用其他方法,而不仅仅是preg_replace()

$nn = preg_replace("/[^0-9+]/", "", $string);
if (substr_count($nn, '+') > 1) {
    $firstPlus = strpos($nn, '+') + 1;
    $nn = substr($nn, 0, $firstPlus) . str_replace('+', '', substr($nn, $firstPlus));
}

此代码将正常执行原始代码preg_replace(),然后,如果结果中有超过 1 个+符号,它将获取结果的子字符串,直到第一个+,然后执行字符串替换以替换所有剩余的+符号。preg_replace()您也可以在这里始终使用第二个,但仅删除一个+符号将是矫枉过正。

这是示例的键盘条目。

于 2012-11-09T13:48:24.033 回答
0

因此,如果您想要删除所有加号和非数字,除了第一个,+那么您需要一个断言:

$str = preg_replace('~  (?! ^ \+)  [^\d]  ~x', "", $str);

请注意,我在这里使用了不同的分隔符~。该x模式用于正则表达式中的额外空格。

仅当+它确实是字符串中的第一个字符时,这才有效。前面是否有空格,两者都会被丢弃。

于 2012-11-09T14:01:35.740 回答
0

据我了解您的问题,您可以使用 preg_replace_callback( http://php.net/manual/en/function.preg-replace-callback.php ) 函数来实现这一点。

脚步:

  1. 获取带括号的 3 位数字并删除括号和前导 0
  2. 删除所有非数字字符(包括+)
  3. 如果它有国家代码,只需在开头添加“+”
  4. 如果不添加“+”国家代码到开头

//$string = '(015) 234-2634';
$string = '+27 (015) 234-2634';
//  \(\d{3}\)\s* to capture (015)
//  \D to capture all non numeric characters
//  ^\d{2} to capture first two digits
$pattern = array("/\(\d{3}\)\s*/","/\D/","/^\d{2}/");

echo preg_replace_callback($pattern, function($matches){
    $countrycode = 27;

    if(strlen($matches[0])>4){ //(015)
        return substr($matches[0],2,-1); //grab 15 from (015)
    }
    else if(is_numeric($matches[0]) && $matches[0]==$countrycode ){
                //if it has country code just add "+" to the begining
        return "+".$matches[0];
    }
    else if(is_numeric($matches[0]) && $matches[0]!=$countrycode ){
                //if it has not country code add "+" and countrycode to the begining
        return "+".$countrycode.$matches[0];
    }
   else{
       // if its not a digit return null
       return null; 
   }
}, $string);

请注意我不是正则表达式专家,它可能有简单的方法来完成你的任务,但这个例子对我来说非常有效。

于 2013-09-04T10:20:53.387 回答