phpでスクリプト内の変数と関数をリストアップする方法

このQ&Aのポイント
  • phpで書かれたスクリプトファイルの中から使用されている関数と変数をリストアップする方法を教えてください。
  • preg_matchを使ってスクリプト内の関数を見つけることができます。適切な正規表現パターンを使用してください。
  • 変数のリストアップにはpreg_matchではなく、適切なパース手法を使うことをおすすめします。
回答を見る
  • ベストアンサー

スクリプトの中から使用されている変数と関数をリストする

phpで書かれたスクリプトファイルの中から使用されている関数と変数をリストアップさせるようなことをしたいのですが、preg_matchを使うのが妥当でしょうか?また、正規表記はどんな感じがベストでしょうか?自分で試してみてもまったくへたくそでして... トホホ ぜひ皆さんの技量を拝見させてください ^^。 <?php $data = file_get_contents('~.php'); $functions = '/\s*\(*/i'; preg_match($functions, $data, $matches); print_r($matches); echo "<br>"; $variables = '/^\$[.+]/i'; preg_match($variables, $data, $matches2); print_r($matches2); echo "<br><br>"; echo $data; ?>

  • jyuu
  • お礼率83% (553/665)
  • PHP
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
回答No.1

正規表現でゴリゴリ書いてもいいのですが、厳密性を求めると無理です。例えば、/* $hoge */、$s='$foo';、$s="\$bar";などは変数ではないので、単純なパターンマッチでは解決できないからです。 token_get_all()という関数があって、これを使うと変数名を抜き出せます。少し工夫すると、関数も抜き出せると思います。 それから、IDE(Zend StudioやEclipse)では、プログラム中で定義されているユーザ定義関数や変数をリストアップしてくれるんじゃないかと思います(テキストエディタばかり使っているので、実のところはよく知らないのです)。 「ずばり」の回答じゃないですね。すみません。

jyuu
質問者

お礼

ありがとうございます。大変参考になりました。感謝いたします。

関連するQ&A

  • URL からドメイン名

    <?php preg_match('@^(?:http://)?([^/]+)@i', "http://www.hogehoge.net/index.html", $matches); $host = $matches[1]; preg_match('/[^.]+\.[^.]+$/', $host, $matches); echo $matches[0]"; ?> 上記だと、co.jpや ne.jpなどの場合うまく行きません。 正規表現もいまいちわかっていないのですが、 $host情報にco.jpなどを含む場合はこれでpreg_match()みたいな方法はないでしょうか?

    • 締切済み
    • PHP
  • PHPでURLのソースの中から数字の文字列を検索したいのですが

    PHPでURLのソースの中から数字の文字列を検索したいのですが <?php $str = 85%80%78%77%70%60%; $pattern="/[0-9]+(?=%)/u"; mb_internal_encoding("UTF-8"); preg_match_all($pattern,$str,$matches); foreach((array) $matches[0] as $val) { print mb_convert_kana($val,"a")."<br>\n"; //半角にして表示 } ?> この記述で、文字列から80%のような 全角文字で%の前の文字だけを抜き出せました。 そこでURLからデーターを抜き出すべく ////////ソース////// <table> <TR> <TD>あ</TD> <TD><B>88%</B>/TD> </TR> <TR> <TD>す</TD> <TD><B>85%</B>/TD> </TR> ........... </table> 下記のように記述しましたが <?php $html_data = file_get_contents("http://www.1234.com/1234.html"); if (preg_match("/<table\s.*>([\s\S]*)<\/table>/i",$contents,$matches)){ $contents = $matches[1]; } $str = $html_data; $pattern="/[0-9]+(?=%)/u"; mb_internal_encoding("UTF-8"); preg_match_all($pattern,$str,$matches); foreach((array) $matches[0] as $val) { print mb_convert_kana($val,"a")."<br>\n"; //半角にして表示 } ?> しかし、動作しません。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • ereg_match関数について

    こんばんは。PHP初めて間もないド素人です。とあるサイトを参考に、バイナリセーフ関数とかいうのととそうでない関数の処理の違いを検証してみようと思い、以下のコードを試してみました。 <?php //preg_match関数がバイナリセーフ関数である事を検証する。 //正規表現文字列にマッチしない文字があれば1を返す。 $kekka=preg_match('/[^a-zA-Z0-9_]/','oh_my_god\x00@'); $kekka2=ereg_match('/[^a-zA-Z0-9_]/','oh_my_god\x00@'); print($kekka); print("<br/>"); print($kekka2); ?> <!--<html>タグがないのにいきなり<br/> とか打っても大丈夫か試してみる。 print_rと打ってみたらなにか変わるか試してみる。--> <br/> <?php print_r($kekka); ?> これを試した結果、 Fatal error: Call to undefined function ereg_match() ...... というエラーがでました。ereg_match関数についてインターネットで 調べてみたのですがヒット率が異常に悪く「もしかしてpreg_match?」 とか表示されたりもしました。今php5を使ってますが、もしかして この関数はもうなくなった関数なのでしょうか?

    • ベストアンサー
    • PHP
  • コードエラーが次のように出てしまいます。

    Notice: Undefined offset: 2 in C:\xampp\htdocs\news2.php on line 18 Warning: file_get_contents(): Filename cannot be empty in C:\xampp\htdocs\news2.php on line 19 プログラミング超初心者です。var_dumpしてみてもarray[2]は存在していたのですが・・・。 なぜこのようなエラーが出るのか、またどのように解決すればよいのでしょうか。わかる方、教えてください。よろしくお願いします。 <?php $newstop="http://headlines.yahoo.co.jp/hl"; $html=file_get_contents($newstop); $patern1='/http.*c=bus/'; preg_match($patern1,$html,$matches1); //var_dump($matches1); $newstop2=($matches1[0]); $html2=file_get_contents($newstop2); //echo($html2); //ここから、記事全文を拾う $fullpattern='/http.*all/'; preg_match_all($fullpattern,$html2,$matches3); $fullurl=($matches3[2]); ※ここが18行目 $fulltext=file_get_contents($fullurl);       ※ここが19行目 echo ($fulltext); //var_dump($matches3); ?>

    • 締切済み
    • PHP
  • 以下のコードでエラーが出てしまいます。

    Notice: Undefined offset: 2 in C:\xampp\htdocs\news2.php on line 18 Warning: file_get_contents(): Filename cannot be empty in C:\xampp\htdocs\news2.php on line 19 プログラミング超初心者です。var_dumpしてみてもarray[2]は存在していたのですが・・・。 なぜこのようなエラーが出るのか、またどのように解決すればよいのでしょうか。わかる方、教えてください。よろしくお願いします。 <?php $newstop="http://headlines.yahoo.co.jp/hl"; $html=file_get_contents($newstop); $patern1='/http.*c=bus/'; preg_match($patern1,$html,$matches1); //var_dump($matches1); $newstop2=($matches1[0]); $html2=file_get_contents($newstop2); //echo($html2); //!ここまでで経済面のトップページはとってこれた //ここから、記事全文を拾う $fullpattern='/http.*all/'; preg_match_all($fullpattern,$html2,$matches3); $fullurl=($matches3[2]); ※ここが18行目 $fulltext=file_get_contents($fullurl);       ※ここが19行目 echo ($fulltext); //var_dump($matches3); ?>

    • 締切済み
    • PHP
  • ファイル内検索関数を作りたいのですが・・・

    質問させて下さい。 PHPファイル内で危険な関数、非推奨になった関数が含まれているかをチェックするスクリプトを考えています。 php.iniにてdisable_functionsを使用すればいいのでしょうが、急に非推奨になったり、 コード規約で省かれたりと言った時に対処するような場合に使用したいと思っております。 コマンドラインから利用しようと思っているのですが、ここでは簡略化の為に引数を取って、1ファイル(check.php)のみに適用させています。 で、以下のように書いてみたのですが、全くエレガントな感じがしません。 自分としては、ファイルにHTMLに<table>にて整形したものを出力したいと考えています。 「どの関数が、どの行に、いくつあるのか」(フォルダを再帰的に調べる場合はパスも含める) 等を出力したいと考えています。 ((search.php) #!/usr/local/bin/php -q <?php $file = $argv[1]; if (!$file) { die('このスクリプトは引数にphpファイルのパスを必要とします。'); } //この中に該当する関数を書き入れる $functions = array( 'preg_match', 'chdir', 'settype', 'system', ); function checkFunc ($line, $functions, $n = 1) { foreach ($functions as $func) { if (strpos($line, $func) === FALSE) { continue; } else { echo($n . '行目に、' . $func . '()が含まれています。' . PHP_EOL); } } } $handle = fopen($file, 'r'); $r = 1; while ($line = fgets($handle, 1024)) { checkFunc($line, $functions, $r); $r++; } fclose($handle); ((check.php)) <?php $string = 'Hello, this is Tom. I love apple'; preg_match('/.*(apple)$/i', settype($string, 'string'), $result); var_dump($result); var_dump(getcwd()); chdir('../'); var_dump(getcwd()); もうちょっとスマートに書きたいのですが、アドバイスを頂けないでしょうか? 自分としてはecho()で出力していくのではなく、「どの関数が、どの行に、いくつあるのか」を貯めていって、 Smartyの変数にassign()で格納し出力といった感じにしたいと思っているのですが、 「どのファイルに」「何行目」、「どの関数が」、「何個」という各変数の扱い方(格納の仕方)が分かりませんでした。 Linux,PHP5.3.8です。

    • ベストアンサー
    • PHP
  • ヒアドキュメントの中で関数を呼び出す方法

    すべての携帯コンテンツをphpで下記のように作成しており、絵文字を使いたいと思いますが、ここの絵文字変換プログラムを多少変更してPHP内で<?php emoji(絵文字番号)>って呼び出しできるようになったのですが、すでにあるPHPコンテンツはヒアドキュメントからecho出力しており、ヒアドキュメント内から関数(絵文字番号)って呼び出すことができません。何かいいアドバイスか他の処理方法をできれば簡単にコードを書いて教えていただけると幸いです。お願いします。 関数----------------- 省略 function emoji($data) { global $agent,$emoji_array; if(preg_match("/[0-9]{1,3}/", $data) && is_numeric($data) && 0 < $data && $data < 253) { switch(mobile($agent)){ case "i"; $put = $emoji_array[$data][1]; break; case "e"; if (preg_match("/[^0-9]/", $emoji_array[$data][2])) { $put = $emoji_array[$data][2]; } else { $put = "<img localsrc=\"".$emoji_array[$data][2]."\" />"; } break; case "s"; if (preg_match("/^[A-Z]{1}?/", $emoji_array[$data][3])) { $put = "\x1B\$".$emoji_array[$data][3]."\x0F"; } else { $put = $emoji_array[$data][3]; } break; case "p"; $put = "[PCでは絵文字は表示されません]"; break; } echo $put; } else { echo "[Error!]\n"; } } ----------------------------------------- &contents = <<<HTML <html> <head> </head> <body> コンテンツコンテンツ<br> →ここで関数(絵文字番号)って呼び出したい! </body> </heml> HTML;

    • 締切済み
    • PHP
  • PHPでWebページの特定部を取得したいのですが、上手くいきません。

    PHPでWebページの特定部を取得したいのですが、上手くいきません。 現在file_get_contentsを用いてURLを指定して取得し、preg_matchの引数にする方法で行っています。 また、preg_matchは以下のように用いています。 preg_match("/パターン(.*?)パターン/s", $html, $matches); print_rで$matchesを表示してみたところArray()のみ出力されます。 また、話が逸れて申し訳ないですが、上記とは別にfile_get_contentsを用いて動的にURLを指定して取得しているのですが、処理に時間がかかります。(約10秒) $wordをURLに組み込む変数として以下のように記述しています。 file_get_contents("http://…".$word."…(URLの続き)"); 以上の2点についてご教示願います。

    • ベストアンサー
    • PHP
  • 正規表現でタグの中身を抜き出し

    <script language="php">・・・・</script> <script language=php>・・・・</script> <?php ・・・・ ?> の中身(・・・・の部分)をpreg_matchで抜き出したいと思っています。 preg_match("/<script language=?"php?">(*.)<\/script>/is" ,$p,$matches) と preg_match("/<php? (*.) ?>/is" ,$p,$matches) としましたがうまくいきません。どのようにしたらいいでしょうか?

    • ベストアンサー
    • PHP
  • PHPでの正規表現について

    こんにちは。最近、正規表現の勉強を始めました。 以下のプログラムをテストしているのですが、思ったとおりに動かずに困っています。 (1)円マークにヒットしない (2)行頭の”今日”にヒットしない(この場合2と4行目にヒットするのでは?) 何がおかしいのか、アドバイスをいただけませんか? <html> <head> <title>正規表現のテスト</title> </head> <body> <pre> <?php $post = '\750 今日は晴れです。今日は晴れです。今日は晴れ です。今日は晴れです。今日は晴れです。今日は晴れです。 今日は晴れです。今日は晴れです。今日は晴れ です。今日は晴れです。今日は晴れです。今日は晴れです。'; function my_insert_post($post){ global $post; preg_match_all("/\\/", $post, $matches);//(1) print_r($matches); preg_match_all("/^今日/", $post, $matches02);//(2) print_r($matches02); echo "<hr />"; print_r($post); } my_insert_post(); ?> </pre> </body> </html> どうぞよろしくお願いいたします。

    • ベストアンサー
    • PHP

専門家に質問してみよう