• ベストアンサー

ASCII文字列のgrep

Windowsのリソースキットのひとつ「subinacl」のコマンドをPHPプログラムからexec()で実行した戻り値に対して、 preg_match()でgrepしようと試しましたが、うまくできませんでした。 $arrAccList = array(); exec("subinacl /verbose=1 /share 【共有名】 , $arrAccList); foreach($arrAccList as $k => $v){  if(preg_match("(grant|deny)", $v)){   print $v;  } } 上記のように書いてみましたがマッチせず、正規表現の部分を「g.r.a.n.t」とするとマッチするという現象です。 mb_detect_encoding()の結果から文字コードはASCIIのようです。 そこでmb_convert_encoding()でASCII⇒EUC-JP、auto⇒EUC-JP・・・と変換してみましたが、 変換された様子が無く、上記と同じ結果となります。 mb_internal_encoding("ASCII")で一時的に内部エンコードを変更してみましたが、やはり同じ結果となりました。 PHPのmbstringの設定は以下のような状態です。 mbstring.detect_order auto mbstring.encoding_translation Off mbstring.func_overload 0 mbstring.http_input pass mbstring.http_output pass mbstring.internal_encoding no value mbstring.language Japanese mbstring.strict_detection Off mbstring.substitute_character no value ASCIIから内部処理文字コードへ変換する方法が間違っているのでしょうか。それとも元々無理な話なのでしょうか。 ご存知の方いらっしゃいましたら、ご教授お願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • tany180sx
  • ベストアンサー率63% (239/379)
回答No.1

subなんとかは分からないのですが、$arrAccListはどんな値なんでしょう。 ソースを見て思うのは preg_match("/(grant|deny)/", $v) ではないですか? 文字コードについては特に判定すべき日本語がなければ ASCIIと返ってきたりします。

d-_-b_zzZ
質問者

お礼

ご回答ありがとうございました。 結局自己解決しました。 帰ってきたコマンドの文字列がNull区切りされていたので、 preg_replace('/\0/', '', $string) でNull文字を置換(削除)して対応しました。

d-_-b_zzZ
質問者

補足

ご回答ありがとうございます。 subなんとかは、共有フォルダのアクセス権を確認・操作するコマンドで、実際には以下のような値が返ってきます。 ======================== +Share 【共有名】 ======================== /control=0x0 /audit ace count =0 /perm. ace count =3 /grant=ドメイン名\アカウント名=c /grant=ドメイン名\アカウント名=c /grant=ドメイン名\アカウント名=c あと、正規表現の部分をご指摘どおり修正してみましたが、結果は同じでした。

その他の回答 (1)

回答No.2

mb_detect_encoding()がASCIIを返すのは特に問題がないです。 そのため、文字コードを変換する必要はありません。 ソースがEUC-JPでもSJISでも、ASCIIと返す場合の文字コードはどの文字コードでも全て同じになります。 exec("subinacl /verbose=1 /share 【共有名】 ", $arrAccList); print_r($arrAccList); なんて書いて、値が正しく取得されているか確認してみると良いかも知れません。

d-_-b_zzZ
質問者

お礼

ご回答ありがとうございました。 結局自己解決しました。 帰ってきたコマンドの文字列がNull区切りされていたので、 preg_replace('/\0/', '', $string) でNull文字を置換(削除)して対応しました。

d-_-b_zzZ
質問者

補足

ご回答ありがとうございます。 print_rの出力は試してみましたが、ブラウザ上では問題なく出力結果が表示されます。 しかし、ファイルに出力して秀丸などのエディタで開いてみると、すべての文字間にNullが挿入された状態で表示されます。 ちなみに、結果の配列を一行ずつ preg_replace('/\s\s+/', '', $str) で置換してみましたがNullは除去できないようでした。 何故Nullが挟まれて出力されるのかわかりませんが、PHPでこのNullを削除する方法は無いものでしょうか。