ベストアンサー
AIに聞いたらできた。 /* 改行区切りの市区名ファイル(A)と、改行区切りの市区名と住所が書かれたファイル(B)が与えられてるとして ファイルBを一行ずつ読んで、それがファイルAの市区名に存在したとき 市区名と市区名を除いた残りの部分をタブ区切りで出力するPHPプログラムを教えて。 ファイルAから正規表現「または」をつかった文を作って検索すると良さそうですが。 <具体例> Aに「調布市」が存在するとして、(B)に「調布市△△町1-2-3」が存在するならば 調布市 (TAB) △△町1-2-3 */ // ファイルAとファイルBのパスを定義 // 実際のファイル名に合わせて変更してください $fileA = 'cities.txt'; $fileB = 'addresses.txt'; // ファイルAを読み込み、改行で分割して市区名の配列を作成 // array_filterを使って空の行を除去し、array_mapを使って余分な空白をトリム $cities = array_map('trim', array_filter(file($fileA, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES))); // ファイルAの内容が空の場合は、処理を終了 if (empty($cities)) { echo "ファイルAに市区名がありません。\n"; exit; } // 正規表現の「または」(||)を使って、市区名のパターンを作成 // 正規表現の特殊文字をエスケープしてから結合 $pattern = '/(' . implode('|', array_map('preg_quote', $cities, array_fill(0, count($cities), '/'))) . ')(.*)/u'; // ファイルBを一行ずつ読み込み、処理を実行 $handleB = fopen($fileB, 'r'); if ($handleB) { while (($line = fgets($handleB)) !== false) { $line = trim($line); // パターンマッチを実行 if (preg_match($pattern, $line, $matches)) { // $matches[1]が市区名、$matches[2]が残りの住所 // タブ区切りで出力 echo $matches[1] . "\t" . trim($matches[2]) . "\n"; } } fclose($handleB); } else { // ファイルBが開けなかった場合の処理 echo "ファイルBの読み込みに失敗しました。\n"; }
この回答はいかがでしたか? リアクションしてみよう