답변:
다음과 같이 분해 기능을 사용할 수 있습니다 .
$myvalue = 'Test me more';
$arr = explode(' ',trim($myvalue));
echo $arr[0]; // will print Test
explode(' ',trim($myvalue))[0]
list($firstword) = explode(' ', trim($myvalue), 1);
limit
매개 변수는 나머지 문자열을 포함하는 마지막 요소를 포함해야하기 때문에 2 여야합니다. 1은 동일한 문자열을 반환합니다. 큰 배열을 만들지 않으면 Elliot 버전과 함께 하나의 라이너로 갈 것입니다.
문자열 함수 ( strtok )가 있습니다.이 함수 는 문자열을 일부 구분 기호를 기반 으로 작은 문자열 ( 토큰 ) 로 나누는 데 사용할 수 있습니다 . 이 스레드의 목적을 위해 공백 문자 에서 문자열을 토큰 화 하여 첫 번째 단어 (첫 번째 공백 문자 앞에있는 것으로 정의 됨)를 Test me more
얻을 수 있습니다 .
<?php
$value = "Test me more";
echo strtok($value, " "); // Test
?>
자세한 내용과 예제는 strtok PHP 매뉴얼 페이지를 참조하십시오 .
strtok
전역 상태를 유지하는 이상하고 위험한 기능입니다. 이 기능을 사용하지 않는 것이 좋습니다.
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를 사용하면 대답을 너무 많이 사용하여 어떻게 해야하는지 지적하지 않아도됩니다.
strstr
때문에 PHP에서 사용할 수 있지만 선택적 매개 변수 (이 예제에서 사용하는)가 추가 되었을 때 입니다. 내가 혼동했기 때문에 그냥 통지, 당신은 왜이 예제의 요구를 명시하는 . 4.3.0
5.3.0
before_needle
5.3.0
echo $i === false ? $myvalue : substr( $myvalue, 0, $i );
비록 늦었지만 PHP는 이것에 대한 하나의 더 나은 해결책을 가지고 있습니다.
$words=str_word_count($myvalue, 1);
echo $words[0];
$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
문자열을 첫 단어와 나머지 문자열의 두 부분으로 토큰 화하는 함수입니다.
반환 값 : 그것은있을 것이다 first
및 remaining
주요 $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;
}
$ first_word = str_word_count (1) [0]
특수 문자에서 작동하지 않으며 특수 문자를 사용하면 잘못된 동작이 발생합니다. UTF-8 친화적이지 않습니다.
자세한 정보 확인을 위해 PHP str_word_count () 멀티 바이트 안전합니까?
당신은 질문을 "문자열에서 첫 번째 공간으로 바꾸고 아무것도 뒤 따르지 않는 모든 것"으로 재구성 할 수 있습니다. 따라서 간단한 정규식을 사용하면됩니다.
$firstWord = preg_replace("/\s.*/", '', ltrim($myvalue));
안전을 위해 ltrim ()에 대한 선택적 호출을 추가했습니다.이 함수는 문자열의 시작 부분에서 공백을 제거합니다.
이러한 각각의 기능 각각이 얼마나 빨리 알고 싶은 경우에, 나는 대부분이 여기에 답변을 투표 여섯에 PHP 7.3에서 벤치마킹 일부 원유 실행 ( strpos
와 substr
, explode
과 current
, 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을 참조하십시오 .
s($str)->words()[0]
있는 것처럼 도움 이 될 수 있습니다 .