PHP에서 문장의 첫 단어를 얻는 방법?


답변:


254

다음과 같이 분해 기능을 사용할 수 있습니다 .

$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 버전에 대한 한 줄 코드 :list($firstword) = explode(' ', trim($myvalue), 1);
Cédric Françoys

3
@ CédricFrançoys limit매개 변수는 나머지 문자열을 포함하는 마지막 요소를 포함해야하기 때문에 2 여야합니다. 1은 동일한 문자열을 반환합니다. 큰 배열을 만들지 않으면 Elliot 버전과 함께 하나의 라이너로 갈 것입니다.
Sdlion

RSS NewYorkTimes 에서 두 번째 단어를 원한다면 어떻게해야 합니까 ? Dmitry Kostyukov 만 원합니다. 어떻게해야합니까? =)

282

문자열 함수 ( strtok )가 있습니다.이 함수 는 문자열을 일부 구분 기호를 기반 으로 작은 문자열 ( 토큰 ) 로 나누는 데 사용할 수 있습니다 . 이 스레드의 목적을 위해 공백 문자 에서 문자열을 토큰 화 하여 첫 번째 단어 (첫 번째 공백 문자 앞에있는 것으로 정의 됨)를 Test me more얻을 수 있습니다 .

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

자세한 내용과 예제는 strtok PHP 매뉴얼 페이지를 참조하십시오 .


3
Briliiant! 원래 솔루션보다 우수
Alberto Fontana

이것이 첫 번째 답이어야합니다. 깔끔한 방식으로 원하는 첫 단어 만 반환합니다.
Wes

2
좋은 해결책이지만 PHP 매뉴얼에서는 다음과 같이 경고합니다.이 함수는 부울 FALSE를 반환하지만 부울 이외의 값을 반환하여 FALSE로 평가할 수도 있습니다.
Jay Harris

1
저는 최소한 6 년 동안 매일 PHP를 사용하고 있으며 지금까지이 기능에 대해 들어 본 적이 없습니다
Epoc

2
strtok전역 상태를 유지하는 이상하고 위험한 기능입니다. 이 기능을 사용하지 않는 것이 좋습니다.
아놀드 다니엘스

39

PHP 5.3이있는 경우

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

이 경우 $myvalue단어 strstr가 하나 인 문자열은 아무 것도 반환하지 않습니다. 해결책은 테스트 문자열에 공백을 추가하는 것입니다.

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

문자열에 단어가 하나만 있어도 항상 문자열의 첫 단어를 반환합니다.

대안은 다음과 같습니다.

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

또는 explode를 사용하면 대답을 너무 많이 사용하여 어떻게 해야하는지 지적하지 않아도됩니다.


1
폭발 또는 정규식을 사용하지 않으면 +1 (부적절한 imho) 또 다른 대안은 strstr을 str_replace와 함께 사용하여 strstr에서 바늘 뒤의 부분을 아무것도 대체하지 않는 것입니다.
Gordon

1
주목할 점은, 이전에 없었기 strstr때문에 PHP에서 사용할 수 있지만 선택적 매개 변수 (이 예제에서 사용하는)가 추가 되었을 때 입니다. 내가 혼동했기 때문에 그냥 통지, 당신은 왜이 예제의 요구를 명시하는 . 4.3.05.3.0before_needle5.3.0
trejder

myvalue를 단일 단어로 설정하면이 경우 strstr은 아무 것도 반환하지 않습니다! 해결책은 테스트 된 문자열의 끝에 항상 공백을 추가하여 문자열의 유일한 단어 인 경우에도 항상 첫 번째 단어로 돌아 오는 것입니다!
patrick

1
단어 사이에 공백 만 있다고 가정하면 탭도 포함됩니다.

그렇게해서는 안됩니다echo $i === false ? $myvalue : substr( $myvalue, 0, $i );
billynoah


13

비록 늦었지만 PHP는 이것에 대한 하나의 더 나은 해결책을 가지고 있습니다.

$words=str_word_count($myvalue, 1);
echo $words[0];

7

한 번의 적은 단계로 허용되는 답변과 유사합니다.

$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
NOTE- 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


그것은 또한 "하나, 둘, 셋"작동하기 때문에 이것은 (허용 대답은 에코 것 "을"), 가장 좋은 해답이 될 것입니다
패트릭

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 쿼리의 첫 문자를 수신하는 훌륭한 솔루션
Intacto

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

0

문자열을 첫 단어와 나머지 문자열의 두 부분으로 토큰 화하는 함수입니다.

반환 값 : 그것은있을 것이다 firstremaining주요 $return각각 배열입니다. strpos( $title," ") !== false문자열에 단어가 하나만 있고 공백이없는 경우 첫 번째 검사 는 필수입니다.

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

이러한 각각의 기능 각각이 얼마나 빨리 알고 싶은 경우에, 나는 대부분이 여기에 답변을 투표 여섯에 PHP 7.3에서 벤치마킹 일부 원유 실행 ( strpossubstr, explodecurrent, strstr, explode과를 trim, str_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>';

?>

다음은 두 번의 연속 실행에서 다양한 결과입니다.

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의 Literate Programming을 참조하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.