PHPでのsubstr関数について

このQ&Aのポイント
  • PHPのsubstr関数について疑問があります。抽出開始位置と抽出する文字数の指定について理解したいです。
  • DOSプロンプト経由でのPEARのインストールでWarnningメッセージが表示されましたが、PEARの機能は問題なく使用できますか?
  • PHPで引数なしの関数(サブルーチン)を呼び出す方法について教えてください。
回答を見る
  • ベストアンサー

PHPでのsubstr関数について

PHPで、3問ほど質問です。 問1 PHPでプログラムを作成していて、思った結果が出てこないので、変数やら配列やらの 中身を表示させつつ、原因らしきものを突き止めました。 substr関数 です。 手元のプチリファレンスには、 substr(元の文字列,抽出開始位置,抽出する文字数) のようなことが書いてあるのですが、 抽出開始位置 ではなく、抽出を開始したい手前の位置 ではないのかと思いました。 というのも、 echo substr("abc",0,1); は、a が表示されますし、 echo substr("abc",3,1); は、何も表示されないからです。 というわけで、 substr(元の文字列,抽出を開始したい手前の位置,抽出する文字数) でいいのでしょうか? ○文字目から数えて、△文字分としたときにずれて表示されるので、ヘンだな~と 思っているのですが…。 問2 DOSプロンプト経由で、PEARをインストールしてみました。 (自分のパソコンです。XAMPPを使用しています) 最終的にinstall ok と表示されましたが、Warnning というメッセージがちらほらと。 大丈夫なんでしょうか? ただ、PEARの機能は使えましたが…。 問3 値を送る・返す関数ではなく、PHPで、サブルーチンというか、VBやVBAでいえば、Call文で 呼んでくるような、文の書き方を教えてください。 sub_keisan(); function sub_keisan(){ } のような引数なしの関数の書き方でいいのでしょうか?

  • PHP
  • 回答数5
  • ありがとう数5

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

  • ベストアンサー
  • BellBell
  • ベストアンサー率54% (327/598)
回答No.2

問1 プログラム上では、『文字列とは文字型データの配列である』という、プログラマとしての常識を前提として書かれているという事ですね。その、"手元のプチリファレンス"には。 (※正確には言語によっては『文字列とは文字列型のクラスである』という場合もあるので、厳密には正しくないが、概ね先の常識を踏襲していると言っていい) 一文字目は、配列インデックスで言えば0(番目)の文字。 問2 >Warnning というメッセージがちらほらと せっかくインストーラが出しているWarnningを読まずに、無視して何がしたいのでしょう? 使いたい機能が使えてるなら、それでいいんじゃないですか? それでイヤなら、ちゃんと読めばいいだけの話です。 問3 VBAに言語構造として、サブルーチンなどありません。 サブルーチンとは考え方、または実装の仕方の話です。 VBAでの Sub sub_keisan(){ } のような、書き方はサブプロシージャです。決してサブルーチンなどではありません。(サブルーチンとして実装したなら、サブルーチンではあるんでしょうが) VBAでは、値を返すプロシージャはFunction、値を返さないプロシージャはSubと別々に実装しているだけです。 PHPはすべて、どちらもFunctionで記述します。(引数を受け取る受け取らない、値を返す返さないはFunction記述者が自由に設計すればいいだけです。

dv8hjkwf
質問者

お礼

了解しました。0番目の文字が、最初になるわけですね。 警告内容を書かないとわかりませんよね。失礼しました。 どちらもFunctionで通じることを確認しました。てっきり別々のものがあるものと思っていました。

その他の回答 (4)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.5

問2についてPEARはPHP4のころからの技術なので PHP5のバージョンと整合性がとれていないだけだと error_reporting(E_ALL ^ E_NOTICE); のようにエラーレベルを調整すればよいかと。 php.iniでも対応可能です。

dv8hjkwf
質問者

お礼

なるほど、バージョンによる整合性ですか。確認してみます。 回答ありがとうございました。

  • notnot
  • ベストアンサー率47% (4845/10255)
回答No.4

1. 文字列の先頭を1文字目と数えるのは、現在メジャーな言語ではVB系くらい。他の言語は先頭は0文字目です。 配列のインデクスの始まりと合わせてるのでしょうね。Cだと文字列型は存在せず、文字の配列しか無いので、その影響だと思います。 2. 警告の内容次第ですが、エラーで無いので大丈夫では? 「警告が出たのですが大丈夫?」と聞かれても答えようが無いです。 3. VBのCallでも引数ありますよね。 引数なしのPHP functionはもちろんOKです。 >VBやVBAでいえば、Call文で呼んでくるような、 の言わんととするところが不明です。引数を括弧で囲まないという意味なら出来ません。

dv8hjkwf
質問者

お礼

配列と同じく、先頭は0から開始で納得しました。 警告内容については、これじゃ分かりませんね。失礼しました。特に、影響らしい影響はないみたいです。 引数なしの functionでうまくいきました。 ご回答ありがとうございました。

回答No.3

>抽出開始位置 ではなく、抽出を開始したい手前の位置 ではないのかと思いました。 http://jp2.php.net/manual/ja/function.substr.php >start が正の場合、返される文字列は、 string の 0 から数えて start番目から始まる文字列となります。 例えば、文字列'abcdef'において位置 0にある文字は、'a'であり、 位置2には'c'があります。 何故公式リファレンスを読まない? >手元のプチリファレンスには、 それにしても最近の糞プログラマは公式リファレンスすら読めないのか? 2. その肝心の中身を書かないでわかるかよ。 俺たちは君のPCを透視できる超能力者か? 3. そんな物必要ない。 それとすべての行を一行開けにするな。読みづらい。

dv8hjkwf
質問者

お礼

公式リファレンスにしっかり書かれていました。「位置 0にある文字は、'a'であり…」 さすがに警告内容を書かないとわかりませんね。 失礼しました。

noname#158634
noname#158634
回答No.1

問1 一般にプログラム言語におけるカウントは0から始まるからです。 問2 メッセージの内容も書かずに分かるわけがあるか(笑) 問3 呼び出そうとしているのが「引数なしの関数」であればその書き方で問題ありません。

dv8hjkwf
質問者

お礼

0からのカウント、了解しました。 配列と同じ考え方ですね。 メッセージ内容については失礼しました。これでは、分かりませんよね。 引数なしの関数の書き方について、確認しました。 ご回答ありがとうございました。

関連するQ&A

  • phpのsubstr_countについて

    <?php $str = "検索対象の文字列をここに指定します。文字列です。文字列。"; $word = "文字列"; var_dump( substr_count( $str, $word ) ); ?> とするとint(3)と帰ってくると思いますが、もし出現回数が5回以上であれば$wordを表示するというプログラムを書きたいのですが、php初心者なのでよくわかりません どなたかアドバイスお願いします。

    • 締切済み
    • PHP
  • substrで一部を表示。

    substrで内容の一部だけを表示したいのですが、うまく出来ません。 一部だけを表示したいデータは「$sub」に格納されています。 $sub2 = substr($sub,0,20); これでもちろんですが途中までの表示になります。 でも、これだと入力ミスのように切れてしまいますよね。 そこで、続きがあるよと言う意味で「...」を語尾につけたいと思ってます。 でも、これがうまく出来ません。 「もし(上の書き方の場合)20文字以上ならsubstrを使って一部表示+...」「じゃ無かったら普通に表示」としたいのですが、どのように書いたらよいでしょうか? 出来るようでしたらそのままずばりの回答をお待ちしています!!

    • ベストアンサー
    • Perl
  • C#でPHPの可変関数のような事ができるでしょうか

    すみません、ご存じの方教えてください。 PHPでは次のような形で文字列で関数を呼び出せるようですが、C#でも同じ事ができますでしょうか? $str = "MyFunc1"; $str("Hellow"); function MyFunc1($abc){ echo "$abc"; }

  • php修正について

    下記のPHPを書いています。 表示したときに_(/)されて文字と日付が出ないといけないのですが? 正しい表示は 強豪ぞろいの天皇賞ー武は1枠で波乱倍増??? (10/27)です。 Mysqlはデータは入っています。 教えてください。 <?php do { ?> <BLINK><IMG src="list.gif" width="13" height="13" border="0"></BLINK><FONT color="#cc00cc"><a href="blog_02.php?id=<?php echo $row_rs_blog_02['id']; ?>"><?php echo mb_substr($row_rs_blog_02['title'],0,30); ?> <?php if (mb_strlen($row_rs_blog['title']) >= '30') { echo('…'); } ?> </a><?php echo "("; echo substr($row_rs_blog_02['date'], 4,2); echo "/"; echo substr($row_rs_blog_02['date'], 6,2); echo ")"; ?></FONT><br> <br> <?php } while ($row_rs_blog_02 = mysql_fetch_assoc($rs_blog)); ?>

    • ベストアンサー
    • PHP
  • substrについて

    入力ファイルから28文字分のファイル名を取り出し、リモートからローカルにダウンロードしたいのですが、substrがうまく働きません。 どのようにすればよいのでしょうか? 以下のとおり記述しています。 open (INPUT,"<$path/$filename") || die "could not open file : $!\n"; print "$path/$filenameファイルをオープンしました。"; print "\n"; while(<INPUT>) { $FTPremotefilename = substr($_,0,28); print "FTPremotefile名は$_です。"; print "\n"; $FTP -> get($FTPremotefile, $FTPlocalfile) || die "Get失敗 $!\n";# ゲット(ファイルのダウンロード) } close (INPUT) || die "could not close file : $!\n"; $_は内容が表示されるのですが、substrで指定した、$FTPremotefileになにも抽出されませんでした。

    • ベストアンサー
    • Perl
  • PATH_INFOで「?」を含む文字列を受け取る方法

    環境変数 PATH_INFOで「?」(クエスチョンマーク)を含む文字列を受け取りたいです。 例えば「hoge.php/test?abc」で $g = $_SERVER['PATH_INFO']; $g = substr($g, 1); echo $g; とすると「abc」と表示されてしまいます。 この際「test?abc」と表示させるには、どのようにすれば良いでしょうか。 宜しくお願いします。

    • ベストアンサー
    • PHP
  • javascriptで2箇所のphpの関数を取得したいのです。

    javascriptで2箇所のphpの関数を取得したいのです。 見よう見まねでやっている初心者です。よろしくお願いします。 javascriptにてphpの関数をよびだしてhtmlのinput type="text"に値を出力しようとしています。 2か所のphp を下記のようにhtmlに書いて取得しようとしたのですがどちらか一方しか取得できません。 なんとか両方を読み込めるようにできないでしょうか?分かりにくい質問かと思いますので例を書いて見ましたのでどうかよろしくお願いいたします。 (例) <script type="text/javascript" src="../data/zzz.php?aaa=abc" ></script> <script type="text/javascript" src="../../../data/xxx.php?bbb=abc" ></script> 上記のように書いても片方しか取得しないようです。 以下../dataのzzz.phpのphpです。 <?php $aaa = $_GET['aaa']; header("Content-type: application/x-javascript"); echo "window.onload = function () {"; if ($aaa== 'abb') {echo "document.getElementById(\"xxx\").value=100;","document.getElementById(\"yyy\").value=1;";} elseif ($aaa == 'abc') {echo "document.getElementById(\"tanka\").value=120;","document.getElementById(\"yyy\").value=2;";} echo "}"; ?> 以下../../../dataのxxx.phpのphpです。(例) <?php $bbb = $_GET['bbb']; header("Content-type: application/x-javascript"); echo "window.onload = function () {"; if ($bbb== 'abb') {echo "document.getElementById(\"zzz\").value=50;","document.getElementById(\"vvv\").value=10;";} elseif ($bbb == 'abc') {echo "document.getElementById(\"tanka\").value=51;","document.getElementById(\"vvv\").value=20;";} echo "}"; ?> 以上2か所のディレクトリのphpを取得したいのですが、これはできない事なのでしょうか?ちがうディレクトリから取得しなければ更新作業が大変になってしまうのです。どうかよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHPのstrpbrk関数ってひらがなを正しく認識しないのでしょうか?

    PHPのstrpbrk関数ってひらがなを正しく認識しないのでしょうか? <pre> <?php $a=strpbrk("あいうえお","う"); echo $a; ?> </pre> のようにプログラムして実行すると、 あいうえお と表示されます。英字の場合 <pre> <?php $a=strpbrk("abcde","c"); echo $a; ?> </pre> とすると cde と正しい結果が得られるのですが。。文字コードも1通り試してみたのですが、うまくいきませんでした。 どなたか、ご回答お願いいたします。

    • ベストアンサー
    • PHP
  • PHPでパラメータ取得

    ※httpのhを省いています。 //index.phpの内部に if( $_REQUEST['m'] == "abc" ) { echo 'abc'; } if( $_REQUEST['m'] == "cde" ) { echo 'cde'; } というプログラムがあり、 ttp://example.com/index.php?a=abc とした時、「abc」が返され、 ttp://example.com/index.php?a=cde とした時、「cde」が返されるのは分かりますが、「abc」も「cde」も両方共表示できるにはどのようなにしたらURLが良いですか? あるいは、プログラムの一部を変えて両方表示する方法はあるでしょうか? ただし、下記の場合を除くとします。 ttp://example.com/index.php?a=abc if( $_REQUEST['m'] == "abc" ) { echo 'abc'; echo 'cde'; } お手数ですが、よろしくお願い致します。

    • ベストアンサー
    • PHP
  • PHPのプログラムについて

    フォームから入力した文字列内に、半角スペース(' ')がいくつ含まれるかを表示させる "This is a pen." ⇒ 3個あります 文字列変数 $str に対して 文字列の長さを得る関数: strlen($str) N番目の文字を得る関数: substr($str,N,1) ※ 先頭文字は0番目 先頭から最後尾まで文字を繰り返し取って,空白文字ならカウントを増やす PHPの部分がまだできていない↓ <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>countBlank.php</title> </head> <body> <h1>空白文字をカウント</h1> <form action="countBlank.php" method="get"> <input type="text" name="str" size=50> <input type="submit" value="送信"> </form> <hr> <?php $space=0; echo("半角スペースは".$space."個あります。"); ?> </body> </html>

専門家に質問してみよう