次のような内容のファイルがあります:
Apple 100
バナナ200
Cat 300
ファイル内の特定の文字列を検索して、次の単語を取得したいと思います。例:猫を検索すると300になります。この解決策を調べました:Strpos()を使用して針の後に次の文字列を見つける方法ですが、それは役に立たず、期待した出力が得られませんでした。正規表現を使用せずに方法を提案していただければ幸いです。
次のような内容のファイルがあります:
Apple 100
バナナ200
Cat 300
ファイル内の特定の文字列を検索して、次の単語を取得したいと思います。例:猫を検索すると300になります。この解決策を調べました:Strpos()を使用して針の後に次の文字列を見つける方法ですが、それは役に立たず、期待した出力が得られませんでした。正規表現を使用せずに方法を提案していただければ幸いです。
これが最善のアプローチかどうかはわかりませんが、提供されたデータがあれば機能します。
完璧ではありませんが、正しい方向に進んでいます。
<?php
$filename = 'data.txt'; // Let's assume this is the file you mentioned
$handle = fopen($filename, 'r');
$contents = fread($handle, filesize($filename));
$clean = trim(preg_replace('/\s+/', ' ', $contents));
$flat_elems = explode(' ', $clean);
$ii = count($flat_elems);
for ($i = 0; $i < $ii; $i++) {
if ($i%2<1) $multi[$flat_elems[$i]] = $flat_elems[$i+1];
}
print_r($multi);
これにより、次のような多次元配列が出力されます。
Array
(
[Apple] => 100
[banana] => 200
[Cat] => 300
)
これを試してください。正規表現は使用されませんが、検索する文字列が長い場合は非効率になります。
function get_next_word($string, $preceding_word)
{
// Turns the string into an array by splitting on spaces
$words_as_array = explode(' ', $string);
// Search the array of words for the word before the word we want to return
if (($position = array_search($preceding_word, $words_as_array)) !== FALSE)
return $words_as_array[$position + 1]; // Returns the next word
else
return false; // Could not find word
}
$find = 'Apple';
preg_match_all('/' . $find . '\s(\d+)/', $content, $matches);
print_r($matches);
名前付き正規表現サブパターンを使用して、探している情報をキャプチャすることでメリットが得られる場合があります。
たとえば、前者の単語の数を見つける(1<=値<=9999)
/*String to search*/
$str = "cat 300";
/*String to find*/
$find = "cat";
/*Search for value*/
preg_match("/^$find+\s*+(?P<value>[0-9]{1,4})$/", $str, $r);
/*Print results*/
print_r($r);
一致するものが見つかった場合、結果の配列には、「値」としてインデックス付けされた、探している数値が含まれます。
このアプローチは、
file_get_contents($file);