アプリ版:「スタンプのみでお礼する」機能のリリースについて

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_orderauto
mbstring.encoding_translationOff
mbstring.func_overload0
mbstring.http_inputpass
mbstring.http_outputpass
mbstring.internal_encodingno value
mbstring.languageJapanese
mbstring.strict_detectionOff
mbstring.substitute_characterno value

ASCIIから内部処理文字コードへ変換する方法が間違っているのでしょうか。それとも元々無理な話なのでしょうか。
ご存知の方いらっしゃいましたら、ご教授お願い致します。

A 回答 (2件)

subなんとかは分からないのですが、$arrAccListはどんな値なんでしょう。


ソースを見て思うのは
preg_match("/(grant|deny)/", $v)
ではないですか?

文字コードについては特に判定すべき日本語がなければ
ASCIIと返ってきたりします。

この回答への補足

ご回答ありがとうございます。

subなんとかは、共有フォルダのアクセス権を確認・操作するコマンドで、実際には以下のような値が返ってきます。

========================
+Share 【共有名】
========================
/control=0x0
/audit ace count =0
/perm. ace count =3
/grant=ドメイン名\アカウント名=c
/grant=ドメイン名\アカウント名=c
/grant=ドメイン名\アカウント名=c

あと、正規表現の部分をご指摘どおり修正してみましたが、結果は同じでした。

補足日時:2009/02/13 09:09
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
結局自己解決しました。

帰ってきたコマンドの文字列がNull区切りされていたので、
preg_replace('/\0/', '', $string) でNull文字を置換(削除)して対応しました。

お礼日時:2009/02/18 11:37

mb_detect_encoding()がASCIIを返すのは特に問題がないです。


そのため、文字コードを変換する必要はありません。
ソースがEUC-JPでもSJISでも、ASCIIと返す場合の文字コードはどの文字コードでも全て同じになります。


exec("subinacl /verbose=1 /share 【共有名】 ", $arrAccList);

print_r($arrAccList);

なんて書いて、値が正しく取得されているか確認してみると良いかも知れません。

この回答への補足

ご回答ありがとうございます。

print_rの出力は試してみましたが、ブラウザ上では問題なく出力結果が表示されます。
しかし、ファイルに出力して秀丸などのエディタで開いてみると、すべての文字間にNullが挿入された状態で表示されます。

ちなみに、結果の配列を一行ずつ preg_replace('/\s\s+/', '', $str) で置換してみましたがNullは除去できないようでした。
何故Nullが挟まれて出力されるのかわかりませんが、PHPでこのNullを削除する方法は無いものでしょうか。

補足日時:2009/02/16 09:40
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
結局自己解決しました。

帰ってきたコマンドの文字列がNull区切りされていたので、
preg_replace('/\0/', '', $string) でNull文字を置換(削除)して対応しました。

お礼日時:2009/02/18 11:37

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!