PHPで文の最初の単語を取得する方法は?


156

文字列から変数の最初の単語を抽出したいのですが。たとえば、次の入力を受け取ります。

<?php $myvalue = 'Test me more'; ?>

結果の出力Testは、入力の最初のワードであるになります。これどうやってするの?


回答:


254

explode関数は次のように使用できます。

$myvalue = 'Test me more';
$arr = explode(' ',trim($myvalue));
echo $arr[0]; // will print Test

100にしましょう、それが私を助けてくれます:)
Shivam Pandya

41
最新のPHP構文を使用すると、次のことができますexplode(' ',trim($myvalue))[0]
Elly Post

2
任意のPHPバージョンの1行のコード:list($firstword) = explode(' ', trim($myvalue), 1);
セドリックFrançoys

3
@CédricFrançoys limitパラメータには2を指定する必要があります。残りの文字列を含む最後の要素を含める必要があるためです。1はまったく同じ文字列を返します。大きなアレイが作成されない限り、1つのライナーにはElliotバージョンを使用します。
Sdlion 2017

RSS NewYorkTimes -media:credit- 2番目の単語が必要な場合-<media:credit> Dmitry Kostyukov for The New York Times </ media:credit>。私はDmitry Kostyukovだけが欲しい-それをどうやってやるの?=)

282

いくつかのセパレータに基づいて文字列を小さな文字列(トークン)に分割するために使用できる文字列関数(strtok)があります。このスレッドの目的のために、最初の単語(最初の空白文字の前にあるものとして定義される)は、空白文字の文字列をトークン化することによって取得できます。Test me more

<?php
$value = "Test me more";
echo strtok($value, " "); // Test
?>

詳細と例については、strtok PHPマニュアルページを参照してください


3
ブリリアン!元のソリューションより優れている
Alberto Fontana、

これが最初の答えです。彼が望んでいたように、最初の単語だけをきれいに返します。
Wes

2
良い解決策ですが、phpマニュアルでは、この関数は警告します:この関数はブール値FALSEを返す可能性がありますが、FALSEと評価される非ブール値を返す場合もあります。
ジェイ・ハリス

1
私は少なくとも6年間毎日PHPを使用していて、この機能について今まで聞いたことがありませんでした
Epoc

2
strtokグローバルな状態を保持する奇妙で危険な機能です。この関数の使用はお勧めできません。
アーノルドダニエルズ

39

PHP 5.3を使用している場合

$myvalue = 'Test me more';
echo strstr($myvalue, ' ', true);

場合ことに注意して$myvalueいる一つの単語と文字列がstrstr、この場合には何も返しません。解決策は、テスト文字列にスペースを追加することです:

echo strstr( $myvalue . ' ', ' ', true );

文字列に単語が1つしかない場合でも、常に文字列の最初の単語が返されます

代替は次のようなものです:

$i = strpos($myvalue, ' ');
echo $i !== false ? $myvalue : substr( $myvalue, 0, $i );

またはそれを使用して非常に多くの答えがある爆発を使用して、私はそれを行う方法を指摘する気になりません。


1
+1は、explodeまたはregexを使用しない(両方とも不適切なimho)。もう1つの方法は、strstrをstr_replaceで使用して、strstrの針の後の部分を何も置き換えないことです。
Gordon

1
注目に値するのは、以前ではなかったstrstrのでPHPで利用可能ですが、オプションのパラメーター(この例で使用しています)が追加されたときです。ただの通知です。私が混乱していたので、なぜこの例が必要であるとあなたが述べるのか、です。4.3.05.3.0before_needle5.3.0
trejder 2013年

myvalueを1つの単語に設定した場合、この場合strstrは何も返しません。解決策は、テストされる文字列の最後に常にスペースを追加して、文字列内の唯一の単語であっても、常に最初の単語が返されるようにすることです。
Patrick

1
単語間のスペースだけが危険であると想定して、タブも含めます。

それはすべきではないecho $i === false ? $myvalue : substr( $myvalue, 0, $i );
ビリーノア



7

受け入れられた回答と同様に、1ステップ少ない:

$my_value = 'Test me more';
$first_word = explode(' ',trim($my_value))[0];

//$first_word == 'Test'

5

文字列が単語で始まるかどうかわからない場合に備えて...

$input = ' Test me more ';
echo preg_replace('/(\s*)([^\s]*)(.*)/', '$2', $input); //Test

trim($input)この例では十分でしょう:P
zanderwar

4
<?php
  $value = "Hello world";
  $tokens = explode(" ", $value);
  echo $tokens[0];
?>

explodeを使用して、入力のすべての単語を取得し、結果の配列の最初の要素を出力します。


4

split関数を使用すると、文字列から最初の単語を取得することもできます。

<?php
$myvalue ="Test me more";
$result=split(" ",$myvalue);
echo $result[0];
?>

5
注-split()は5.3以降非推奨>
Leo


2
$ input = "もっとテストしてください";
echo preg_replace( "/ \ s。* $ /"、 ""、$ input); //「テスト」

2

個人的にはstrsplit/ explode/ strtokは単語の境界をサポートしていないため、より正確な分割を行うには、\w

preg_split('/[\s]+/',$string,1);

これにより、境界のある単語が制限1に分割されます。


RobertPitt-> preg_splitと比較して、単語の境界でstrtokが失敗した例を示すと便利です。
MarcoZen

1
$string = ' Test me more ';
preg_match('/\b\w+\b/i', $string, $result); // Test
echo $result;

/* You could use [a-zA-Z]+ instead of \w+ if wanted only alphabetical chars. */
$string = ' Test me more ';
preg_match('/\b[a-zA-Z]+\b/i', $string, $result); // Test
echo $result;

よろしく、Ciul


これは "
patrick

1
public function getStringFirstAlphabet($string){
    $data='';
    $string=explode(' ', $string);
    $i=0;
    foreach ($string as $key => $value) {
        $data.=$value[$i];
    }
    return $data;
}

1

あなたはPHPの文字列関数substrを使用して、文字列を配列に要求することなくそれを行うことができます。

 $string = 'some text here';
 $stringLength= strlen($string);
 echo ucfirst(substr($string,-$stringLength-1, 1));

//出力S


MySQLクエリの最初の文字を受信して​​、選択、挿入、更新などのクエリ操作を認識する
優れた

0
$str='<?php $myvalue = Test me more; ?>';
$s = preg_split("/= *(.[^ ]*?) /", $str,-1,PREG_SPLIT_DELIM_CAPTURE);
print $s[1];

0

文字列を最初の単語と残りの文字列の2つの部分にトークン化する関数。

戻り値:それぞれ配列firstremainingキーを持ち$returnます。strpos( $title," ") !== false文字列に単語が1つしかなく、スペースがない場合、最初のチェックは必須です。

function getStringFirstWord( $title ){

    $return = [];

    if( strpos( $title," ") !== false ) {

        $firstWord = strstr($title," ",true);
        $remainingTitle = substr(strstr($title," "), 1);

        if( !empty( $firstWord ) ) {
            $return['first'] = $firstWord;
        }
        if( !empty( $remainingTitle ) ) {
            $return['remaining'] = $remainingTitle;
        }
    }
    else {
        $return['first'] = $title;
    }

    return $return;
}


0

strokを使用して大文字または小文字を確認できないため、これは最初の単語の確認に最適です。

if (strtolower(strtok($text, " ")) == strtolower($firstword)){ .. }

0

質問は、「文字列内の最初のスペースとそれに続くすべてを何も置換しない」として再定式化できます。したがって、これは単純な正規表現で実現できます。

$firstWord = preg_replace("/\s.*/", '', ltrim($myvalue));

安全のためにltrim()へのオプションの呼び出しを追加しました。この関数は文字列の先頭にあるスペースを削除します。


0

ここでのすべての回答は、最初の単語が見つかった場合でも、プロセッサがすべての文字列を検索する必要があるアプローチを使用しています。大きな文字列の場合、これは推奨されません。このアプローチは最適です。

function getFirstWord($string) {
    $result = "";
    foreach($string as $char) {
        if($char == " " && strlen($result)) {
            break;
        }
        $result .= $char;
    }
    return $result;
}

0

あなたはこれらの各機能のそれぞれがどれだけ速く知りたい場合は、私はほとんどがここで答えを投票し6の上にPHP 7.3でベンチマークいくつかの粗走った(strpossubstrexplodecurrentstrstrexplodeとしtrimstr_word_countそしてstrtokその速度を比較するために1,000,000回の反復ごとに)。

<?php

$strTest = 'This is a string to test fetching first word of a string methods.';

$before = microtime(true);
for ($i=0 ; $i<1000000 ; $i++) {
    $p = strpos($strTest, ' ');
    $p !== false ? $strTest : substr( $strTest, 0, $p );
}
$after = microtime(true);
echo 'strpos/ substr: '.($after-$before)/$i . ' seconds<br>';

$before = microtime(true);
for ($i=0 ; $i<1000000 ; $i++) {
    strstr($strTest, ' ', true);
}
$after = microtime(true);
echo 'strstr: '.($after-$before)/$i . ' seconds<br>';

$before = microtime(true);
for ($i=0 ; $i<1000000 ; $i++) {
    current(explode(' ',$strTest));
}
$after = microtime(true);
echo 'explode/ current: '.($after-$before)/$i . ' seconds<br>';

$before = microtime(true);
for ($i=0 ; $i<1000000 ; $i++) {
    $arr = explode(' ',trim($strTest));
    $arr[0];
}
$after = microtime(true);
echo 'explode/ trim: '.($after-$before)/$i . ' seconds<br>';

$before = microtime(true);
for ($i=0 ; $i<1000000 ; $i++) {
    str_word_count($strTest, 1);
}
$after = microtime(true);
echo 'str_word_count: '.($after-$before)/$i . ' seconds<br>';

$before = microtime(true);
for ($i=0 ; $i<1000000 ; $i++) {
    strtok($value, ' ');
}
$after = microtime(true);
echo 'strtok: '.($after-$before)/$i . ' seconds<br>';

?>

2回の連続実行の結果は次のとおりです。

strpos/ substr: 6.0736894607544E-8 seconds
strstr: 5.0434112548828E-8 seconds
explode/ current: 3.5163116455078E-7 seconds
explode/ trim: 3.8683795928955E-7 seconds
str_word_count: 4.6665270328522E-6 seconds
strtok: 4.9849510192871E-7 seconds

strpos/ substr: 5.7171106338501E-8 seconds
strstr: 4.7624826431274E-8 seconds
explode/ current: 3.3753299713135E-7 seconds
explode/ trim: 4.2293286323547E-7 seconds
str_word_count: 3.7025549411774E-6 seconds
strtok: 1.2249300479889E-6 seconds

そして、関数の順序を逆にした後の結果:

strtok: 4.2612719535828E-7 seconds
str_word_count: 4.1899878978729E-6 seconds
explode/ trim: 9.3175292015076E-7 seconds
explode/ current: 7.0811605453491E-7 seconds
strstr: 1.0137891769409E-7 seconds
strpos/ substr: 1.0082197189331E-7 seconds

結論これらの関数間の速度は大きく異なり、期待されるテスト実行間で一貫性がないことがわかりました。これらの迅速でダーティなテストによれば、選択された6つの関数のいずれでも、妥当な時間内にジョブが実行されます。実行時間を妨げている他の実行中のプロセスを含む摂動があります。したがって、プログラマーにとって最も実用的で読みやすい意味のある関数を使用してください。プログラミングの全体像については、Donald Knuthの文芸的プログラミングを参照してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.