2011-09-07 24 views
4

この質問には多くのバリエーションがあり、いくつかのジェネレータを試しましたが、これに一致する正規表現を見つけることができません。 「345-324-3243 X039」のような電話番号があるとします。数字、文字x、プラス記号(国際番号で表示されます)以外のすべてを削除したいとします。私はそれが「3453243243X039」に出て来てほしいが、代わりに、私は「30234から2349」を取得数値、文字x、プラス記号(Regex、PHP)以外のすべてを削除します

$phone = "345-324-3243 X039"; 
preg_replace('[^\d|x|\+]', '', $phone); 

は、ここに私の現在の非稼働正規表現とコードです。

答えて

6

文字クラス内のリテラルなので、大文字の "X"(小文字の "x")をキャプチャしてください。正規表現 "/ quotes /"を使用してください(そうでなければ、 "[引用符]")と結果を使用します。

$phone = "345-324-3243 X039"; 
$phone = preg_replace('/[^\dxX+]/', '', $phone); 
// $phone is 3453243243X039 

コーディングハッピー。

1

|を正規表現から削除し、+からエスケープしてください。

+1

'+'は、文字クラスの内部にある必要はないが、すでにエスケープされています。 '| 'は不要ですが、この入力の結果には影響しないはずです。 –

1

あなたの結果に残りの-文字を取得するだけでなく、まったく異なる数字が表示されますか?それは私にとって奇妙です。文字を削除するだけで30234-2349345-324-3243 X039から取得することはできません。その入力内の唯一の0が最後の近くにあります。それは、文字がシャッフルされ、削除されるのとほぼ同じです。

あなたのパターンの周りに正規表現の区切り文字がないことに気づきます。私はこれまでのことを思い出してはいないので、その効果は分かりませんが、それは正規表現の唯一の機能的問題です。文字クラス内の|はリテラル|文字と解釈されますが、投稿したサンプル入力の結果には影響しません。私が使用したい

コードはこれです:

$phone = preg_replace('/[^\dx+]/i', '', $phone); 

私は/.../区切り文字に正規表現を包みましたが、|を削除エスケープを解除+(文字クラス内の任意の効果を持つべきではありません)、大文字のXをキャッチするために大文字と小文字を区別しませんでした。

関連する問題