人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

下記のshell_exec...の部分をWindowsのxampp環境で動くように修正する場合、どのように修正すべきか教えてください。
//検索開始
$ARY = split("\n",shell_exec("/bin/cat $FILE | /bin/grep '^$KEY'"));
foreach ($ARY as $VAL) {
if ($VAL != "") {
list($NUM,$NAME) = split(":",$VAL,2);
if (preg_match("/^$KEY/",$NUM)) {
//文字列にマッチした部分を赤で強調
$NUM = preg_replace("/^$KEY/","<font color=red>$KEY</font>",$NUM);
print $NUM . ':' . $NAME . "\n";
$CNT++;
}
if ($CNT == 30) { //補完候補が30件になったら終了
break;
}
}
}

拾ったコードを修正しようとしていますが、shell_execの一行をどう修正していいかわかりません。テキストファイルを改行コードでsplitして検索しようとしているのはわかるのですが、
shell_exec("/bin/cat $FILE | /bin/grep '^$KEY'")
のコマンド発行(?)部分のコードの読み方がわかりません。

ご教示願います。

●質問者: kon39392
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

質問者から

ちなみに下記のコードを参考にしています。
http://cmf.ohtanz.com/suggest


1 ● a-kuma3
●30ポイント

こんな感じに、変えれば良いんじゃないでしょうか。

<?php
// $ARY = split("\n",shell_exec("/bin/cat $FILE | /bin/grep '^$KEY'"));
$ARY = split("\n", file_get_contents($FILE));
$ARY = preg_grep("^$KEY", $ARY);

foreach ($ARY as $VAL) {
 ...
?>

shell_exec が起動しているコマンドは、$FILE の名を持つファイル (./post.txt) から、$KEY で始まる行だけを抽出する、という二つのコマンドの組合せです。
/bin/cat がファイルの内容をそのまま出力。
/bin/grep が、与えられた正規表現にマッチする行だけを抜き出す役目を持ってます。


kon39392さんのコメント
ご回答ありがとうございます。 ちなみに今のままだと 検索候補が表示されるスペースに No ending delimiter '^' found in ... とエラーが表示され、検索結果をとってこれてないようです。 $ARY = preg_grep("^$KEY", $ARY);の部分をどう修正したら 改善するでしょうか? 正規表現などの話になるのでしょうか、調べましたがいまいちわかりません。 ご教示願います。

2 ● oil999
●70ポイント ベストアンサー

Windows環境ではgrepを別途インストールする必要がありますが、ご質問の要件であればPHPだけで次のようにして実現できます。

<?php
//検索開始
$fp = fopen($FILE, 'r');
while (!feof($fp)) {
 $str = fgets($fp);
 if (preg_match("/^{$KEY}/", $str, $arr) != 0) {
 array_push($ARY, $arr[0]);
 }
}
flose($fp);

foreach ($ARY as $VAL) {
 if ($VAL != "") {
 list($NUM,$NAME) = split(":",$VAL,2);
 if (preg_match("/^$KEY/",$NUM)) {
 //文字列にマッチした部分を赤で強調
 $NUM = preg_replace("/^$KEY/","<font color=red>$KEY</font>",$NUM);
 print $NUM . ':' . $NAME . "\n";
 $CNT++;
 }
 if ($CNT == 30) { //補完候補が30件になったら終了
 break;
 }
 }
}
?>

kon39392さんのコメント
ご回答ありがとうございます。 そのまま使用させて頂こうと思った場合、 preg_grepの行で preg_grep() expects parameter 2 to be array string given in .. というエラーがでているようで、 検索候補が表示されるスペースに上記エラーが表示されてしまいます。 解決策を教えていただくことは可能でしょうか?

oil999さんのコメント
回答のソースを修正しました。 お試しください。

kon39392さんのコメント
ご対応いただきありがとうございます。 そのまま使用させていただこうとしましたら、 たとえば「2」と入力した場合に、候補が「2:2:2:2:2:2:2: ...」と表示されてしまいます。$VALを":"で分割するときに$NAMEが取得できてないのでしょうか? 頼ってばかりで申し訳ありませんが、原因を教えていただけませんでしょうか?

kon39392さんのコメント
ちなみにarray_push処理が終わったあとの$ARYをprint_rでみたところ、すべて同じ値(テキストボックスへの入力値)のみとなっておりました。一致部分のみが格納されている感じでしょうか。 あと、「:」と名前部分が格納されるためにはどうしたらよろしいでしょうか?

oil999さんのコメント
**すべて同じ値(テキストボックスへの入力値)のみとなっておりました テキストボックスにどうやって入力し、どの変数(またはファイル)に渡っているのか分からないので、お答えしようがありません。

kon39392さんのコメント
すみません、気づけば当初の質問からかなりそれたことを聞いておりました。 ここから先は自分でがんばってみます。 大きなヒントをいただきありがとうございました。

oil999さんのコメント
お役に立てたかどうか分かりませんが、また何か分からないことがありましたらご質問ください。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ