web-dev-qa-db-ja.com

PHPサブストリング抽出。最初の「/」または文字列全体の前の文字列を取得します

部分文字列を抽出しようとしています。 PHPでそれを行うのに助けが必要です。

以下は、私が使用しているサンプル文字列と必要な結果です。

home/cat1/subcat2 => home

test/cat2 => test

startpage => startpage

最初の/まで文字列を取得したいのですが、/が存在しない場合は、文字列全体を取得します。

私は試した、

substr($mystring, 0, strpos($mystring, '/'))

私はそれが言うと思う-/の位置を取得してから、位置0からthat位置までの部分文字列を取得します。

ステートメントを大きくしすぎることなく、/がない場合の処理​​方法がわかりません。

PHPステートメントを複雑にしすぎることなく、そのケースを処理する方法はありますか?

142
anon355079

explode() を使用します

$arr = explode("/", $string, 2);
$first = $arr[0];

この場合、limitパラメーターをexplodeに使用して、phpが必要以上に文字列をスキャンしないようにします。

225
gnud

最も効率的なソリューションは、 strtok 関数です。

strtok($mystring, '/')

例えば:

$mystring = 'home/cat1/subcat2/';
$first = strtok($mystring, '/');
echo $first; // home

そして

$mystring = 'home';
$first = strtok($mystring, '/');
echo $first; // home
236
jmarceli
$first = explode("/", $string)[0];
94
AndyBrandy

これはどうですか :

substr($mystring.'/', 0, strpos($mystring, '/'))

Mystringの末尾に「/」を追加するだけで、少なくとも1つ存在することを確認できます;)

11
IRCF

受け入れられた回答の1行バージョン:

$out=explode("/", $mystring, 2)[0];

PHP 5.4以降で動作するはずです

8
glyph

これはおそらく私の頭に浮かんだ最も短い例です:

list($first) = explode("/", $mystring);

1)list()は、区切り文字が見つかった場合、"/"まで文字列を自動的に割り当てます
2)区切り文字"/"が見つからない場合、文字列全体が割り当てられます

...そしてパフォーマンスに本当に夢中になったら、追加のパラメーターを追加してexplode("/", $mystring, 2)を分解し、返される要素の最大数を制限します。

8
pavlovich

PHP 5.3の関数strstr()がこの作業を行う必要があります。ただし、3番目のパラメーターはtrueに設定する必要があります。

ただし、5.3を使用していない場合、以下の関数は正確に機能するはずです。

function strbstr( $str, $char, $start=0 ){
    if ( isset($str[ $start ]) && $str[$start]!=$char ){
        return $str[$start].strbstr( $str, $char, $start+1 );
    }
}

私はそれをテストしていませんが、これはうまく動作するはずです。そして、それはかなり速いです

5
Ronald

後期は決してないよりはましです。 phpには、そのための事前定義関数があります。これが良い方法です。

strstr

マッチ前の部分を取得したい場合は、before_needle(3番目のパラメーター)をtrueに設定します http://php.net/manual/ en/function.strstr.php

function not_strtok($string, $delimiter)
{    
    $buffer = strstr($string, $delimiter, true);

    if (false === $buffer) {
        return $string;
    }

    return $buffer;
}

var_dump(
    not_strtok('st/art/page', '/')
);
4
aimme

次のような正規表現を使用してみてください。

$s = preg_replace('|/.*$|', '', $s);

ただし、正規表現が遅い場合があるため、パフォーマンスが問題となる場合は、これを適切にベンチマークし、より適切な場合は部分文字列で他の代替を使用してください。

2
t00ny

それを処理するヘルパー関数を作成できます:

/**
 * Return string before needle if it exists.
 *
 * @param string $str
 * @param mixed $needle
 * @return string
 */
function str_before($str, $needle)
{
    $pos = strpos($str, $needle);

    return ($pos !== false) ? substr($str, 0, $pos) : $str;
}

ユースケースは次のとおりです。

$sing = 'My name is Luka. I live on the second floor.';

echo str_before($sing, '.'); // My name is Luka
2
user5134807

currentexplodeを使用すると、プロセスが容易になります。

 $str = current(explode("/", $str, 2));
2
user1518659
$string="kalion/home/public_html";

$newstring=( stristr($string,"/")==FALSE ) ? $string : substr($string,0,stripos($string,"/"));
0
kalion