• ベストアンサー

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

  • PHP
  • 回答数2
  • ありがとう数3

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

  • ベストアンサー
  • 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を削除する方法は無いものでしょうか。

関連するQ&A

  • ASCII文字列をEUCなどに変換したいができない

    いつもお世話になっております。 ファイルの文字コードがEUCのファイルの中に、 なぜか、文字コードがASCIIである文字列があります。 この文字列は、外部から受け取るカタチなので、 これはこれで、ASCIIでも、しかたないのかなという風に思い、 それならば、受け取った後、EUCに変換すればいいやと考え、 mb_convert_encoding($var,"EUC-JP","ASCII")を使って、変換を試みるも、 ASCIIのままなのです。 ASCIIである文字列には、変換されない鉄壁さというものがあるのでしょうか? 変換処理後に、mb_detect_encoding()で検査しますが、やはりASCIIのままです。 それならば!、ということで、 受け取る値(ここでは例として、"This_Value_is_ASCII_Encoding_hogehoge9999")を いったん手動のコピペ操作をして、 $UketoruAtai = "This_Value_is_ASCII_Encoding"; とし、 その値もやはり、ASCII文字列になっているので、 この、手動コピペ文字列ならば文字コードの変換はできるだろうと思い、 上記のmb_convert_encoding()の処理をしたわけですが、 この場合でも、やはり ASCIIは鉄壁でした。 いったい、これは、なんなんでしょうか、、、。 ちなみに、このASCII文字列は、英数字のみ(当たり前か。笑)の文字列です。 このASCII文字列を、EUC-JPにする手助けを、どなたか宜しくお願い致します。

    • ベストアンサー
    • PHP
  • mb_convert_encoding で 一部の文字が変換できない。

    こんにちは、初めて質問させていただきます。 PHPでテキストファイルに保存されたEUC-JPの文字列情報を UTF-8で表示しようとしています。 第一水準、第二水準程度の日本語は問題なく変換ができてるのですが、 「(7)」や「VII」などの特殊な記号文字が変換できないようです。 これは mb_convert_encoding の仕様なのでしょうか? ご存知でしたらご教授お願いいたします。 【ソース】 $buffer = "マル4→(4) ギリシャ4→IV 郵便番号→〒 株式会社→(株) \n"; echo mb_convert_encoding($buffer, "utf-8", "euc-jp"); 【出力結果】 マル4→? ギリシャ4→? 郵便番号→〒 株式会社→? 【環境情報】 Linux (OS、バージョン詳しくは分かりません。) PHP Version 4.3.9 mbstring.detect_order      no value mbstring.encoding_translation  Off mbstring.func_overload      0 mbstring.http_input       pass mbstring.http_output       pass mbstring.internal_encoding    EUC-JP mbstring.language        Japanese mbstring.script_encoding     no value mbstring.substitute_character  no value (Local Value、Master Value 共に同値です。)

    • ベストアンサー
    • PHP
  • UTF-8で文字化け

    いつもお世話になっております。 全てのファイルをEUC-JP で作成しております。 Googleマップを使用することになり、1ページだけ UTF-8 で出力したいと思います。 php.ini の設定は以下のようになっております。 -------------------------------------------------- default_charset EUC-JP mbstring.detect_order no value mbstring.encoding_translation Off mbstring.func_overload 0 mbstring.http_input pass mbstring.http_output EUC-JP mbstring.internal_encoding EUC-JP mbstring.language Japanese mbstring.substitute_character no value -------------------------------------------------- Googleマップを出力するページで以下のようにしたのですが 文字化けが直りません。 map.php -------------------------------------------------- ini_set("default_charset", "UTF-8"); mb_internal_encoding("UTF-8"); 他に設定する箇所はありますでしょうか。 よろしくご教示お願いいたします。 <環境> PHP:4.3.1

    • ベストアンサー
    • PHP
  • 日本語が使いたいのですが[mbstring]設定がわかりません

    環境は winxp sp2 apache 2.0.54 php 5.0.4 argosoftmailserver php.iniの設定は [mbstring] mbstring.language = Japanese mbstring.internal_encoding = EUC-JP mbstring.http_input = auto mbstring.http_output = SJIS mbstring.encoding_translation = Off mbstring.detect_order = auto mbstring.substitute_character = none です。足らない事があればお願いします。 下はphpの文です。 <?php $subject = "テスト"; $message = "あいうえお"; $test="日本語エンコーディングテスト"; print "$test (" . mb_detect_encoding($test) . ")<br>"; print ("mbstring.http_input=". mb_http_input() ."<br>"); print ("mbstring.http_output=". mb_http_output() ."<br>"); print ("mbstring.internal_encoding= ".mb_internal_encoding()."<br>"); $subject = mb_convert_encoding($subject, "SJIS", "EUC-JP"); $message = mb_convert_encoding($message , "SJIS", "EUC-JP"); mb_language("Japanese"); $chk = mb_send_mail('******@*******',$subject,$message,'From:***@******.dyndns.org'); if($chk==FALSE) { print "送信失敗"; } else { print "送信完了"; } ?> エンコードテストの結果は以下です。 日本語エンコーディングテスト (SJIS) mbstring.http_input= mbstring.http_output=SJIS mbstring.internal_encoding= EUC-JP よろしくお願いします。

    • ベストアンサー
    • PHP
  • phpでの書き出しでの文字化け解消について

    お世話になります。 SJISを使いたく、php.iniを次のように設定しましたが、まったく文字が読めない状態で書き出されてしまいます。問題点をお教えいただけないでしょうか。 default_charset="Shift_JIS" mbstring.language=Japanese mbstring.internal_encoding=EUC-JP mbstring.http_input = auto mbstring.http_output = SJIS mbstring.encoding_translation=On mbstring.detect_order=auto また、内部円コーディングのmbstring.internal_encoding=EUC-JP はこれでよいのでしょうか。SJISを使うなら、SJISのほうがよいのでしょうか。 どなたか、お助けいただけないでしょうか。 どうか、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • エンコーディングについて

    設定(php.ini)での設定では mbstring.language = Japanese mbstring.internal_encoding = EUC-JP mbstring.http_input = auto mbstring.http_output = auto mbstring.encoding_stranslation = On mbstring.detect_order = auto mbstring.substitute_character = none mbstring.func_overload = 0 で行っています。 そこで、mb_http_input()関数で設定を見ようと思っても表示されません。これは他の皆様も表示されないのでしょうか? また、スクリプト上での設定方法 mb_language("Japanese"); mb_detect_order("auto"); ini_set("mbstring.http_input", "auto"); mb_http_output("auto"); mb_internal_encoding("EUC-JP"); mb_substitute_character("none"); ととある本に書いてあったのですが、ini_set("mbstring.http_input", "auto");ではなく、mb_http_input("auto");ではまずいのでしょうか? 初心者なのでわかりやすく教えていただければ幸いです。

    • ベストアンサー
    • PHP
  • PHPの文字化け

    PHP4.3.2 Windows2000 PostgreSQL RedHat Linux DBから取得した値をCSVファイルに書き出します。 この時に日本語が文字化けをしてしまうのです。 php.iniの設定を変えれば、良いのでしょうか? 初歩的な質問で申し訳ありませんが、 よろしくお願いします。 php.iniの設定内容 default_charset = "SJIS" mbstring.language = Japanese mbstring.internal_encoding = eucJP-win mbstring.http_input = ASCII,JIS,Windows-31J,UTF-8,EUC-JP mbstring.http_output = Windows-31J mbstring.detect_order = ASCII,JIS,Windows-31J,UTF-8,EUC-JP mbstring.substitute_character = none DBの設定内容 List of databases Name | Owner | Encoding -----------+----------+---------- test | postgres | EUC_JP

    • ベストアンサー
    • PHP
  • mbstringのMaster Valueの部分を変えることはできませんか?

    mbstring.detect_order    『no value』『no value』 mbstring.encoding_translation『On』『Off』 mbstring.func_overload    『0』『0』 mbstring.http_input     『auto』『pass』 mbstring.http_output     『Shift_JIS』『pass』 mbstring.internal_encoding  『Shift_JIS』『no value』 mbstring.language      『Japanese』『neutral』 mbstring.substitute_character『no value』『no value』 上記のような設定を mbstring.detect_order    『auto』『auto』 mbstring.encoding_translation『On』『On』 mbstring.func_overload    『0』『0』 mbstring.http_input     『auto』『auto』 mbstring.http_output     『sjis』『EUC-JP』 mbstring.internal_encoding  『sjis』『EUC-JP』 mbstring.language      『Japanese』『EUC-JP』 mbstring.script_encoding   『no value』『no value』 mbstring.substitute_character『no value』『no value』 このように設定することはできるのでしょうか? .htaccessで設定する場合はLocal Valueの部分が変更されるのですよね? Master Valueの部分も変更する場合にはどうしたらよいのでしょうか?

    • 締切済み
    • PHP
  • 文字化けの原因を教えてください。

    WindowsでスクリプトをEUCで保存し、シフトJISでブラウザへ出力ときの 設定として以下のようにphp.iniを設定しています。 ~php.ini~ output_buffering = On output_handler = mb_output_handler magic_quotes_gpc = Off default_charset = Shift_JIS extension_dir = C:/php/ext extension=php_mbstring.dll mbstring.language = Japanese mbstring.internal_encoding = EUC-JP mbstring.http_input = auto mbstring.http_output = SJIS mbstring.encoding_translation = On mbstring.detect_order = auto mbstring.substitute_character = none ~php.ini~ mb_detect_encodingでDBから取得した値の文字コードは、SJISでした。 mb_convert_encoding($dbdata,"EUC-JP","SJIS")で正しく表示されます。 iniファイルの設定のみで正しく表示するにはどのように設定するのがいいのでしょうか?それとも、このような文字コード変換は必須なのでしょうか? よろしくお願いします。 [PHP使用環境] PHP=5.1.6 OS=Windows2000 PRO webserver=apatch2.0 [DB環境(リモートサーバ)] DB=MS SQL Server2000 OS=Windows2003 server R2

    • 締切済み
    • PHP
  • scandir関数取得結果の文字化け

    PHPスクリプトでローカルのディレクトリ名を 取得するプログラムを下記のとおり作成しました。 <?php $list = scandir($rootdir); foreach($list as $dirname){ print($dirname."<br>"); } ?> 取得結果は下記のとおりで 日本語が文字化けてしまいます。 010_�^�C_�ߋ��̗� 020_�^�C_�ߋ��̗��Q mb_convert_encoding($dirname, "UTF-8", "auto"); を行えば文字化けせずに出力できるのですが、 他にwindows環境でこの文字化けに対する回避方法はないのでしょうか? ご教授願います。 [環境] WindwosXP Pro SP3 PHP Version 5.2.9-2 [表示ページの文字コード] <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> [php.iniのmbstring設定] mbstring.language = Japanese mbstring.internal_encoding = UTF-8 mbstring.http_input = pass mbstring.http_output = pass mbstring.encoding_translation = Off mbstring.detect_order = SJIS,EUC-JP,JIS,UTF-8,ASCII mbstring.substitute_character = none; mbstring.func_overload = 0 以上よろしくお願いします。

    • 締切済み
    • PHP

専門家に質問してみよう