下記の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'")
のコマンド発行(?)部分のコードの読み方がわかりません。

ご教示願います。

回答の条件
  • 1人10回まで
  • 13歳以上
  • 登録:2013/01/11 18:16:37
  • 終了:2013/01/11 22:43:20
id:kon39392

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

ベストアンサー

id:oil999 No.2

oil999回答回数1728ベストアンサー獲得回数3202013/01/11 20:22:40

ポイント70pt

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;
        }
    }
}
?>
他5件のコメントを見る
id:kon39392

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

2013/01/11 22:42:38
id:oil999

お役に立てたかどうか分かりませんが、また何か分からないことがありましたらご質問ください。

2013/01/11 23:09:13

その他の回答(1件)

id:a-kuma3 No.1

a-kuma3回答回数4412ベストアンサー獲得回数18032013/01/11 19:24:20

ポイント30pt

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

<?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 が、与えられた正規表現にマッチする行だけを抜き出す役目を持ってます。

id:kon39392

ご回答ありがとうございます。
ちなみに今のままだと
検索候補が表示されるスペースに
No ending delimiter '^' found in ...
とエラーが表示され、検索結果をとってこれてないようです。

$ARY = preg_grep("^$KEY", $ARY);の部分をどう修正したら
改善するでしょうか?
正規表現などの話になるのでしょうか、調べましたがいまいちわかりません。
ご教示願います。

2013/01/11 20:27:04
id:oil999 No.2

oil999回答回数1728ベストアンサー獲得回数3202013/01/11 20:22:40ここでベストアンサー

ポイント70pt

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;
        }
    }
}
?>
他5件のコメントを見る
id:kon39392

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

2013/01/11 22:42:38
id:oil999

お役に立てたかどうか分かりませんが、また何か分からないことがありましたらご質問ください。

2013/01/11 23:09:13

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません