- ベストアンサー
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から内部処理文字コードへ変換する方法が間違っているのでしょうか。それとも元々無理な話なのでしょうか。 ご存知の方いらっしゃいましたら、ご教授お願い致します。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
その他の回答 (1)
- みずの(@mizuno3)
- ベストアンサー率73% (192/263)
お礼
ご回答ありがとうございました。 結局自己解決しました。 帰ってきたコマンドの文字列がNull区切りされていたので、 preg_replace('/\0/', '', $string) でNull文字を置換(削除)して対応しました。
補足
ご回答ありがとうございます。 subなんとかは、共有フォルダのアクセス権を確認・操作するコマンドで、実際には以下のような値が返ってきます。 ======================== +Share 【共有名】 ======================== /control=0x0 /audit ace count =0 /perm. ace count =3 /grant=ドメイン名\アカウント名=c /grant=ドメイン名\アカウント名=c /grant=ドメイン名\アカウント名=c あと、正規表現の部分をご指摘どおり修正してみましたが、結果は同じでした。