2

基本的に、入力フィールドは単なる文字列です。人々は電話番号をさまざまな形式で入力します。これらの数字を検索してリンクに変換するには、正規表現が必要です。

入力例:

(201) 555-1212
(201)555-1212
201-555-1212
555-1212

ここに私が欲しいものがあります:

<a href="tel:(201)555-1212">(201) 555-1212</a> - Notice the space is gone
<a href="tel:(201)555-1212">(201)555-1212</a>
<a href="tel:201-555-1212">201-555-1212</a>
<a href="tel:555-1212">555-1212</a>

単にスペースを削除するよりも堅牢である必要があることはわかっていますが、従業員が iPhone からアクセスする内部 Web サイト用です。だから、私は「ただそれを機能させたい」と思っています。

これまでの C# の内容は次のとおりです (これは、正規表現について私がどれだけ知っているかを示しているはずです)。

strchk = Regex.Replace(strchk, @"\b([\d{3}\-\d{4}|\d{3}\-\d{3}\-\d{4}|\(\d{3}\)\d{3}\-\d{4}])\b", "<a href='tel:$&'>$&</a>", RegexOptions.IgnoreCase);

これを修正するか、これを行うためのより良い方法を提案することで、誰かが私を助けることができますか?

編集:

みんな、ありがとう。ここに私がこれまでに持っているものがあります:

strchk = Regex.Replace(strchk, @"\b(\d{3}[-\.\s]\d{3}[-\.\s]\d{4}|\(\d{3}\)\s*\d{3}[-\.\s]\d{4}|\d{3}[-\.\s]\d{4})\b", "<a href='tel:$1'>$1</a>", RegexOptions.IgnoreCase);

市外局番 (nnn) を除いて、市外局番と 7 桁の番号の間にスペースがある場合とない場合を除いて、ほぼすべてをピックアップしています。7 桁の番号を取得し、そのようにリンクします。ただし、市外局番を指定した場合は一致しません。私が間違っていることは何か分かりますか?

2番目の編集:

動作するようになりました。私がし\bたことは、文字列の先頭から を削除することだけでした。

4

3 に答える 3

2

を削除し、各 の前後に (0 個以上の空白文字) を[]追加します。\s*\-

また、エスケープする必要はありません-。(\からお持ち帰りいただけます\-)

説明:[abcA-Z]は、、、、またはとの間の任意の文字に一致する文字グループです。 それはあなたがやろうとしていることではありません。abcAZ


編集

更新された正規表現への応答:

  • これらの文字の 1 つまたは複数に一致するように変更[-\.\s]します (たとえば、前後にスペースがある a) 。[-\.\s]+-
  • 問題は\b、スペースと(.
于 2010-07-21T18:27:27.593 に答える
1

Afaik, 電話は他の文字に入らないので、? に置き換え[^0-9]てみません''か?

于 2010-07-21T18:27:37.853 に答える
1

電話番号を見つけるために私が書いた正規表現は次のとおりです。

(\+?\d[-\.\s]?)?(\(\d{3}\)\s?|\d{3}[-\.\s]?)\d{3}[-\.\s]?\d{4}

かなり柔軟です...さまざまな形式が可能です。

次に、一連の後方参照を使用してスペースなしで置き換えようとする代わりに、一致を関数に渡し、必要に応じてスペースを削除します。

C#/.netには、置換引数として関数を許可するメソッドが必要です...

編集:彼らはそれを「MatchEvaluator 」と呼んでいます。その例ではデリゲートを使用していますが、もう少し冗長なものを使用できると確信しています

(m) => m.Value.Replace(' ', '')

か何か。ここでメモリから作業します。

于 2010-07-21T18:31:43.103 に答える