3

を除く文字列内のすべての非数字を置き換えたい+

私はこの質問を試しましたが、機能していません...

これが私が現在持っているものです:

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

何らかの方法で削除することを除いて、100%動作+します...

編集

私の入力には常に1+しか含まれていません。それ以上ある場合は、削除する必要があります。

基本的に、ユーザーが電話番号を入力した場合は、(南アフリカの国コード-後の段階で+27を追加します)(015) 234-2634として返されますが、入力された場合は返されます。+27152342634+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

UPDATE(最初の一致のみを保持+
最新の質問更新ごとに、最初 +に見つかったシンボルのみを保持する必要もあります。これを行うには、最初の記号の位置に関する「ルール」がない可能性があるため(「文字列の最初の文字である必要がある」など)、次以外の追加の方法を使用することをお勧めします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桁を取得し、括弧と先行ゼロを削除します
  2. 数字以外の文字(+を含む)をすべて削除します
  3. 国コードがある場合は、先頭に「+」を追加するだけです
  4. そうでない場合は、先頭に「+」country_codeを追加します

//$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 に答える