PHP5.5で文字列の途中を抜くにはどのような関数を使いますか?

以下のように変数に文字列が入っており、$a~$bの部分だけ切り取り$xのようにしたいのです。
いくつか条件があります。
1. $aの文字列が$vに見つからなかったら先頭から、$bの文字列が$vに見つからなかったら最後までとします。
2. $aや$bの文字列が$vにいくつか見つかった場合には、最初に見つかった文字からとし、$bも最初に見つかった文字までとします。
3. $aの文字列が$bより後に見つかった場合、$xは空白とします。
よろしくお願いします。

$v = "あいうえおかきくけこさしすせそ";
$a = "え";
$b = "すせ";

$x = "おかきくけこさし";

回答の条件
  • 1人1回まで
  • 13歳以上
  • 登録:2014/09/24 21:54:27
  • 終了:2014/09/25 12:38:21

ベストアンサー

id:a-kuma3 No.1

a-kuma3回答回数4490ベストアンサー獲得回数18592014/09/24 22:32:45

ポイント100pt

正規表現でいけそうな気もしなくはないんですが、素直に文字列関数を組み合わせてみました。

<?php
    function cut_s($v, $a, $b) {
        $i = strpos($v, $a);
        if (! $i) {
            $i = 0;
        } else {
            $i = $i + strlen($a);
        }
        $j = strpos($v, $b);
        if (! $j) {
            $j = strlen($v);
        }
        return $i < $j ? substr($v, $i, $j - $i) : '';
    }
?>

以下のテストコードを実行した結果が、

<?php
    /* 切り出す */
    $v = "あいうえおかきくけこさしすせそ";
    $a = "";
    $b = "すせ";
    echo "|" . cut_s($v, $a, $b) . "|\n";

    /* 開始が見つからない */
    $a = "";
    $b = "すせ";
    echo "|" . cut_s($v, $a, $b) . "|\n";

    /* 終了が見つからない */
    $a = "";
    $b = "";
    echo "|" . cut_s($v, $a, $b) . "|\n";

    /* 開始と終了の位置が逆転 */
    $a = "こさ";
    $b = "うえ";
    echo "|" . cut_s($v, $a, $b) . "|\n";

    /* 開始も終了も見つからない */
    $a = "んぺ";
    $b = "んぺ";
    echo "|" . cut_s($v, $a, $b) . "|\n";

    /* 開始が複数見つかる */
    $v = "あいうえおかきくえけこさしえすせそ";
    $a = "";
    $b = "すせ";
    echo "|" . cut_s($v, $a, $b) . "|\n";

    /* 終了が複数見つかる */
    $a = "";
    $b = "";
    echo "|" . cut_s($v, $a, $b) . "|\n";
?>

こんな感じになります。

|おかきくけこさし|
|あいうえおかきくけこさし|
|おかきくけこさしすせそ|
||
|あいうえおかきくけこさしすせそ|
|おかきくえけこさしえ|
|う|


Ideone.com と言うサイトで、動作の確認をしたのがこちらです。
http://ideone.com/PBjstZ



最後に、使った文字列関数のマニュアルのリンクを。

id:wsapp

ご回答ありがとうございます。
パーフェクトです。
開始文字数などでコントロールするなど考え付きもしませんでした。
勉強になりました。
ありがとうございます m(_ _)m

2014/09/25 12:38:03

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません