カテゴリー
Linux

PHP で複数の検索キーワード (needle) が文字列に含まれているか調べ、存在すれば一致する検索キーワードを得るやり方

こんな時に役に立つ

住所の中にどの都道府県が含まれているのかを知りたい時。

まとめ

実演。2 つの住所が混ざった文字列の中に都道府県が含まれているのか ? 、含まれているのならどの都道府県か ? を調べる

最初の都道府県を得るコード例です。 preg_match を使用しています。

$pattern = '/北海道|青森県|岩手県|宮城県|秋田県|山形県|福島県|茨城県|栃木県|群馬県|埼玉県|千葉県|東京都|神奈川県 |新潟県|富山県|石川県|福井県|山梨県|長野県|岐阜県|静岡県|愛知県|三重県|滋賀県|京都府|大阪府|兵庫県|奈良県|和歌山県|鳥取県|島根県|岡山県|広島県|山口県|徳島県|香川県|愛媛県|高知県|福岡県|佐賀県|長崎県|熊本県|大分県|宮崎県|鹿児島県|沖縄県/u';
$subject = '北海道札幌市中央区北5条西2丁目5番地 JRタワーオフィスプラザさっぽろ東京都港区芝公園4丁目2-8';
$result = preg_match($pattern, $subject, $matches);
echo print_r($matches, true);

実演です。

# php -a
Interactive shell

php > $pattern = '/北海道|青森県|岩手県|宮城県|秋田県|山形県|福島県|茨城県|栃木県|群馬県|埼玉県|千葉県|東京都|神奈川県 |新潟県|富山県|石川県|福井県|山梨県|長野県|岐阜県|静岡県|愛知県|三重県|滋賀県|京都府|大阪府|兵庫県|奈良県|和歌山県|鳥取県|島根県|岡山県|広島県|山口県|徳島県|香川県|愛媛県|高知県|福岡県|佐賀県|長崎県|熊本県|大分県|宮崎県|鹿児島県|沖縄県/u';
php > $subject = '北海道札幌市中央区北5条西2丁目5番地 JRタワーオフィスプラザさっぽろ東京都港区芝公園4 丁目2-8';
$result = preg_match($pattern, $subject, $matches);
echo print_r($matches, true);
$subject = '北海道札幌市中央区北5条西2丁目5番地 JRタワーオフィスプラザさっぽろ東京都港区芝公園4 丁目2-8';
php > $result = preg_match($pattern, $subject, $matches);
echo print_r($matches, true);
$result = preg_match($pattern, $subject, $matches);
php > echo print_r($matches, true);
echo print_r($matches, true);
Array
(
    [0] => 北海道
)
php >

次に、全ての都道府県を得るコード例です。今度は preg_match_all を使用しています。

$pattern = '/北海道|青森県|岩手県|宮城県|秋田県|山形県|福島県|茨城県|栃木県|群馬県|埼玉県|千葉県|東京都|神奈川県 |新潟県|富山県|石川県|福井県|山梨県|長野県|岐阜県|静岡県|愛知県|三重県|滋賀県|京都府|大阪府|兵庫県|奈良県|和歌山県|鳥取県|島根県|岡山県|広島県|山口県|徳島県|香川県|愛媛県|高知県|福岡県|佐賀県|長崎県|熊本県|大分県|宮崎県|鹿児島県|沖縄県/u';
$subject = '北海道札幌市中央区北5条西2丁目5番地 JRタワーオフィスプラザさっぽろ東京都港区芝公園4丁目2-8';
$result = preg_match_all($pattern, $subject, $matches);
echo print_r($matches, true);

実演です。

# php -a
Interactive shell

php > $pattern = '/北海道|青森県|岩手県|宮城県|秋田県|山形県|福島県|茨城県|栃木県|群馬県|埼玉県|千葉県|東京都|神奈川県 |新潟県|富山県|石川県|福井県|山梨県|長野県|岐阜県|静岡県|愛知県|三重県|滋賀県|京都府|大阪府|兵庫県|奈良県|和歌山県|鳥取県|島根県|岡山県|広島県|山口県|徳島県|香川県|愛媛県|高知県|福岡県|佐賀県|長崎県|熊本県|大分県|宮崎県|鹿児島県|沖縄県/u';
php > $subject = '北海道札幌市中央区北5条西2丁目5番地 JRタワーオフィスプラザさっぽろ東京都港区芝公園4 丁目2-8';
$result = preg_match_all($pattern, $subject, $matches);
echo print_r($matches, true);
$subject = '北海道札幌市中央区北5条西2丁目5番地 JRタワーオフィスプラザさっぽろ東京都港区芝公園4 丁目2-8';
php > $result = preg_match_all($pattern, $subject, $matches);
echo print_r($matches, true);
$result = preg_match_all($pattern, $subject, $matches);
php > echo print_r($matches, true);
echo print_r($matches, true);
Array
(
    [0] => Array
        (
            [0] => 北海道
            [1] => 東京都
        )

)
php >

おわりに

検索キーワードが 1 つなら、 strpos を使うべきです。 2 ~ 3 個でも、そうでしょう。でも、 47 個の場合、書くのが面倒です。

性能を重視して追い求める、時間はたっぷりある、という時は strpos を 47 回書いた時との実行時間をしっかりと比較して頑張って書くのが良いと思います。しかし、お手軽に調べたいという時は、今回のやり方が良いかと思います。

ちなみに、都道府県は 厚生労働省の都道府県番号 から取得しました。

以上です。

コメントを残す