コマンドラインでPHPを使っています。

$path[$i] にはファイルのパスが入ります。
$handle = popen(“grep -c ‘<a[ ¥t¥n][^>]*href’ $path[$i]”, “r”);
と書くと「指定されたファイルが見つかりません。」と出るのですが、試しに
$handle = popen(“ls $path[$i]”, “r”); とするとエラーは出ません。
また、cygwin で直接「grep -c ...」と打つと、意図したとおり実行されます。
どうしたら「指定されたファイルが見つかりません。」と出ることなく、意図したとおりに実行されるでしょうか。

引用符と¥は、そのまま書けないようでしたので、質問文では全角にしました。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2006/01/24 00:44:37
  • 終了:--

回答(4件)

id:hive7134 No.1

hive7134回答回数167ベストアンサー獲得回数162006/01/24 03:32:38

ポイント18pt

違ったらごめんなさい。

¥のかわりに¥¥とすべきなのでは?

id:hkn

そうなんですか。URL で根拠を示してくださるとありがたいんですが。調べてみますね。

cygwin で直接「grep ...」と打つと大丈夫なので、大丈夫だと思っていたんですけど。

ちなみに、¥¥としても「指定されたファイルが見つかりません。」と出ました。

引き続き、回答を募集します。

追加情報ですが、ls の代わりに cat にすると、止まっているように見えました。

単に popen 関数の使い方を間違えているのか心配です。

PHP のバージョンは 4.3.10 です。Windows XP で cygwin を使っています。

2006/01/24 04:06:32
id:PaulYamamoto No.2

Paul回答回数113ベストアンサー獲得回数22006/01/24 11:05:49

ポイント18pt

grep -c だとファイル数しか出力されないので、-l だと思うのですが・・・

id:hkn

そうなんですか? マッチ数を表示させたいのですが。

URLを見ると、以下のように書いてありますけど。

-c 通常の出力はせず、各入力ファイルについてマッチした行数を表示します。

-l 通常の出力はせず、このオプションを指定しなかったときに出力される入力ファイルの名前を表示します。スキャン動作は最初のマッチで終了します。

そもそもこの質問文で突っ込むべきところはそこじゃない気がします。

2006/01/24 13:09:33
id:hive7134 No.3

hive7134回答回数167ベストアンサー獲得回数162006/01/24 11:59:27

ポイント17pt

回答になりませんが、

echo “grep -c ‘<a[ ¥t¥n][^>]*href’ $path[$i]”;

して出力された文字列を

直接Cygwin上で打ちむ文字列と比較してみると解決の糸口がつかめるかもしれません。^^;

http://www.kauda.jp/~suguru/comp/php/strings.html#double_quot

PHP�ł̕������̏�����

ところで

“grep -c ‘<a[ ¥t¥n][^>]*href’ $path[$i]”

の変わりに

“grep -c ‘<a[ ¥¥t¥¥n][^>]*href’ {$path[$i]}”

とした場合はどうなりますでしょうか?

何らかの原因で$path[$i]がうまく展開されずバラバラになっていないかな?と思い、{}で囲んだのですが。

ちなみに¥¥としたのは、二重引用符「”」内部では¥はエスケープする必要があるからです。

id:hkn

¥¥の件ですが、納得しました。ありがとうございます。

$path[$i] は {} で囲んでも変わりませんでした。

$path[$i] の代わりに、$path[$i]に入るパスを代入した普通の変数を使っても、同じ状態です。

2006/01/24 13:44:31
id:PaulYamamoto No.4

Paul回答回数113ベストアンサー獲得回数22006/01/24 14:32:12

ポイント17pt

何度もすいません・・・

ただ単にマッチ数を表示させたいのであれば

popenじゃなくて

execかsystemだと思うのですが・・・

popenの場合なんかの数字をのファイルを

オープンしようとしてしまうので、

「指定されたファイルが見つかりません。」

と出てしまうと思います

id:hkn

あー、そうなんですか。なるほど。ありがとうございます。

$num = exec(“grep -c ‘<a[ ¥¥t¥¥n][^>]*href’ $path[$i]”); という感じでしょうか?

試してみましたが、相変わらず「指定されたファイルが見つかりません。」と出ます。

でも grep の検索条件から「<」を抜くと、期待した結果が出ました。

正規表現の書き方に問題があるんでしょうか。試しに「¥<」と書いてもエラーが出るのですが。

----------

追記:

PHP ですが、Win32 用のバイナリを使っていたからだったみたいです。

Cygwin でコンパイルしてみたら、大丈夫でした。

お友達が教えてくれました。お騒がせしました。

2006/01/26 08:00:08

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

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

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

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

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