チェックだけでなく、情報を抽出する正規表現を取得する方法

私は文字列が郵便番号かどうかをチェックするための正規表現を持っています。しかし、私は本当に完全なアドレス(または、可能であれば、任意の文字列)から抽出することもできるようにしたいと思います。

ここに私の現在の正規表現があります:

/^((\d{5}-\d{4})|(\d{5})|([a-zA-Z]\d[a-zA-Z]\s\d[a-zA-Z]\d)|([a-zA-Z]\d[a-zA-Z]\d[a-zA-Z]\d))$/

必要であれば、私は関数(私はPHPでチェックしています)を解決するつもりですが、私はむしろregexpを可能な限り作業したいと思います。

1

3 答え

PHPは()のグループをの配列に抽出します preg_match()

$matches = array();
$pattern = "/^((\d{5}-\d{4})|(\d{5})|([a-zA-Z]\d[a-zA-Z]\s\d[a-zA-Z]\d)|([a-zA-Z]\d[a-zA-Z]\d[a-zA-Z]\d))$/";
preg_match($pattern, $your_source, $matches);
print_r($matches);
2
追加された
うん、私はそれを知っていた。しかし、それは私が大きな文字列からその正規表現を抽出するのに役立つわけではありません。正規表現内の変数のみ
追加された 著者 Martin,

preg_match, which I assume you're already using when you're checking a string against your regular expression, also gives you back the actual text that matched your pattern.

preg_match($regex, $input, $matches);
echo $matches[0];

3番目の引数は、入力と正規表現のマッチングを試みた結果で満たされます。 $ matches [0] にはパターン全体に一致するテキストが含まれ、より高いインデックスにはサブパターンのキャプチャ(括弧で囲まれたパターンの部分)に一致するテキストが含まれます。

しかし、あなたの場合、パターンは入力開始 ^ と入力終了 $ 文字で囲まれています。 全体入力文字列(または複数行モードの全行)。このパターンを使用して大きな文字列から郵便番号を抽出する前に、 ^ $ を削除する必要があります。

2
追加された
完璧!あなたは正しいです、私はpreg_match()を使用していて、3番目のパラメータのおかげで変数を配列にグループ化しました。しかし、 ^ $ に関する情報は私が必要なものです
追加された 著者 Martin,

あなたは完全なアドレスで作業しているので、正確にアドレスを抽出して検証し、そのコンポーネント(完全なZIPコードを含む)を解析して素敵な応答を提供できるサービスに頼らないのはなぜですか?それは確かに推測を排除するだろう。以下のスクリーンショットは、あらゆる種類のテキストからアドレスを抽出できるSmartyStreetsによるツールを示しています。完全な開示のため、私は SmartyStreets のソフトウェア開発者です。

https://smartystreets.com/account/extract

LiveAddress extraction

0
追加された
PHP - 日本のコミュニティ [ja]
PHP - 日本のコミュニティ [ja]
4 参加者の

このグループではPHPについて話します。 パートナー:kotaeta.com