PHP 부분 문자열 추출. 첫 번째 '/'또는 전체 문자열 앞에 문자열을 가져옵니다.


170

하위 문자열을 추출하려고합니다. PHP에서 도움이 필요합니다.

다음은 작업중 인 샘플 문자열과 필요한 결과입니다.

home/cat1/subcat2 => home

test/cat2 => test

startpage => startpage

첫 번째까지 문자열을 얻고 /싶지만 존재하지 않으면 /전체 문자열을 가져옵니다.

나는 시도했다

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

나는 그것이 위치라고 생각하고 /위치 0에서 위치로 부분 문자열을 얻는다 .

/문을 너무 크게 만들지 않고 no가있는 경우를 처리하는 방법을 모르겠습니다 .

PHP 문장을 너무 복잡하게 만들지 않고 그 경우를 처리하는 방법이 있습니까?


1
이 독립형 라이브러리에s($str)->beforeFirst('/') 있는 것처럼 도움 이 될 수 있습니다 .
caw

답변:


261

사용하다 explode()

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

이 경우, php가 필요한 것보다 더 이상 문자열을 스캔하지 않도록 limit매개 변수를 사용하고 explode있습니다.


2
+1 답변 주셔서 감사합니다. 그것은 효과가 있었다 :) 그러나 하나의 질문. 나는 이것을 할 수 있습니다-> $arr = explode('/',$mystring,2); echo $arr[0];. 한 문장 자체에서 첫 번째 문자열을 얻을 수 없습니다 echo explode('/',$mystring,2)[0];. explode가 배열을 반환하기 때문에 올바르게 할 수 있습니까? 하지만 오류가 발생합니다. 어떤 제안?

1
PHP는 함수의 반환 값으로 인덱싱하는 것을 좋아하지 않습니다.
gnud

3
오. 괜찮아. 가능하다면 좋았을 것입니다.

36
explode() + [0]쓰기에 대한 장황한 방법입니다strtok($string, "/")
마리오

5
그건

293

가장 효율적인 솔루션은입니다 strtok기능 :

strtok($mystring, '/')

예를 들면 다음과 같습니다.

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

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

25
이는 current-explode솔루션 보다 약 40 % 빠릅니다 . (내가 너무 자주 사용하여 중요하지는 않습니다.)
towr

5
이것은 우아하고 빠르다-허용되는 답변이어야한다.
코스타 콘 토스

5
이것은 예외 답변이어야합니다. explode주어진 솔루션 보다 훨씬 더 빠르고 더 많은 메모리와 CPU 사이클이 효율적 입니다.
Shivam Maheshwari

의 문제 strtokIS는 first/second반환 first하지만 /second반환 second빈 문자열이 아닌.
rybo111

위의 의견에 더하여 : 빈 부분을 찾은 동작은 PHP 4.1.0에서 변경되었습니다. 새로운, 올바른 동작은 그 문자열의 일부 생략하면서 이전의 동작은 빈 문자열을 반환
rybo111

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

2
우아하지만 컴퓨터 시간에는 그다지 효율적이지 않습니다. 그러나 요즘 사람들은 CPU 사이클에 대해 더 이상 신경 쓰지 않습니다
Dennis

13

이건 어때?

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

mystring 끝에 '/'를 추가하면 최소한 하나 이상이 있는지 확인할 수 있습니다.)


이 작업을 수행하기 전에 문자열에 슬래시가 하나 있는지 확인할 수 있습니다. 어쨌든 가장 간단한 솔루션입니다.
Guilherme Sampaio

12

허용되는 답변의 한 줄 버전 :

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

PHP 5.4 이상에서 작동


1
아래의 것과 달리 "2"는 생성하는 배열 항목의 수를 제한합니다. 좋은 생각이야
캘리포니아 벤

9

이것은 아마도 내 생각에 가장 짧은 예일 것입니다.

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

1) 구분 기호를 찾을 list()때까지 자동으로 문자열을 할당합니다. 2) "/"구분 기호를 찾지
못하면 "/"전체 문자열이 할당됩니다.

... 실제로 성능에 사로 잡히면 추가 매개 변수를 추가하여 분해 할 수 explode("/", $mystring, 2)있는 최대 요소를 제한 할 수 있습니다 .


2
나는이 접근법을 좋아한다. 불필요한 배열 만들기를 저장합니다. 그리고 strtok()안전하지 않습니다.
rybo111

1
@ rybo111 : 안전하지 않은 것은 무엇입니까 strtok()?
hakre

@ rybo111 나는 hakre의 감정을 반향한다; strtok()안전하지 않은 이유는 무엇 입니까?
Doktor J

@hakre jmarceli의 답변에 대한 답장을 참조하십시오. PHP 버전에 따라 예기치 않은 동작이 발생할 수 있습니다.
rybo111 2016 년

PHP 4.1.0-랠리?
hakre 2016 년

8

늦어도 안 하는것 보단 낫다. php에는 미리 정의 된 기능이 있습니다. 여기 좋은 방법이 있습니다.

strstr

일치하기 전에 부품을 얻으려면 before_needle (3 번째 매개 변수)을 http://php.net/manual/en/function.strstr.php 로 설정 true 하십시오.

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

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

    return $buffer;
}

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

끈이 바늘에 있는지 확신 할 수없는 경우 사용하기에 안전하지 않습니다.
fooquency

@fooquency — True이지만 확인하려는 문자열 끝에 항상 문자를 추가 할 수 있습니다.
MikeSchinkel

감사. 내 테스트는 strstr보다 약간 빠릅니다 strtok. 나는 전자와 함께 갈 것이다.
Ian Y.

5

PHP 5.3의 strstr () 함수가이 작업을 수행해야합니다. 그러나 세 번째 매개 변수는 true로 설정되어야합니다.

그러나 5.3을 사용하지 않으면 아래 기능이 정확하게 작동합니다.

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

나는 그것을 테스트하지는 않았지만 이것은 잘 작동해야합니다. 그리고 그것은 매우 빠릅니다.


3
의 경우 +1 strstr()이지만 false문자열에을 포함하지 않으면 반환 $needle되므로 explode()위 의 솔루션이이 경우에 더 적합합니다.
Benjamin

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

3

다음과 같은 정규식을 사용해보십시오.

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

때로는 정규 표현식이 느리기 때문에 성능에 문제가있는 경우이를 올바르게 벤치마킹하고 더 적합한 하위 문자열로 다른 대안을 사용하십시오.


2
정규식은 아마도 과잉 일 수도 있지만, 내가 말한 것에 대해 explode더 빠르면 재미있을 것입니다.
rvighne

1
이것에는 전혀 문제가 없으며 왜 2 개의 다운 보트가 필요한지 생각할 수 없습니다. 나는 개인적으로 정규 표현식을 사용하지 않을 것이지만 확실히 틀린 것은 아닙니다.
billynoah

2

currenton explode을 사용 하면 프로세스가 쉬워집니다.

 $str = current(explode("/", $str, 2));

0
$string="kalion/home/public_html";

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

0

이 한 줄 솔루션을 사용할 수도 있습니다

list($substring) = explode("/", $string);

-1

나는 이것이 작동해야한다고 생각합니까?

substr($mystring, 0, (($pos = (strpos($mystring, '/') !== false)) ? $pos : strlen($mystring)));

$ pos에 할당하기 전에 (strpos ($ mystring, '/')! == false)를 수행하기 때문에 함수는 항상 첫 번째 문자를 반환합니다. (($ pos = strpos ($ firstColumnName, '_'))! == false). 이것은 질문을 게시 한 사람이 찾고있는 1 라이너입니다.
Mihai P.

-1

왜 사용하지 :

function getwhatiwant($s)
{
    $delimiter='/';
    $x=strstr($s,$delimiter,true);
    return ($x?$x:$s);
}

또는:

   function getwhatiwant($s)
   {
       $delimiter='/';
       $t=explode($delimiter, $s);
       return ($t[1]?$t[0]:$s);
   }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.