199

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

これが私が扱っているいくつかのサンプル文字列と私が必要とする結果です:

home/cat1/subcat2 => home

test/cat2 => test

startpage => startpage

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

私は試した、

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

の位置を/取得してから、位置0からその位置までの部分文字列を取得します。

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

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

4

13 に答える 13

291

使用するexplode()

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

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

于 2009-12-20T14:11:03.063 に答える
102
$first = explode("/", $string)[0];
于 2011-12-30T12:18:17.120 に答える
16

これはどうですか :

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

mystringの最後に「/」を追加するだけで、少なくとも1つあることを確認できます;)

于 2011-03-30T14:25:54.467 に答える
12

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

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

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

于 2017-02-28T00:05:42.760 に答える
9

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

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

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

...そして、パフォーマンスに本当に夢中になっている場合は、explode に追加のパラメーターを追加しexplode("/", $mystring, 2)て、返される要素の最大数を制限することができます。

于 2015-04-23T14:18:33.310 に答える
5

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

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

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

于 2009-12-20T14:50:32.163 に答える
5

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 );
    }
}

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

于 2011-03-08T15:18:02.137 に答える
3

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

/**
 * 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
于 2016-08-24T13:16:11.653 に答える
3

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

 $str = current(explode("/", $str, 2));
于 2012-12-31T07:14:09.783 に答える
-1
$string="kalion/home/public_html";

$newstring=( stristr($string,"/")==FALSE ) ? $string : substr($string,0,stripos($string,"/"));
于 2010-11-20T13:06:09.200 に答える