특정 문자 뒤의 문자열 부분 제거


144

PHP에서 특정 하위 문자열 다음에 모든 것을 제거하는 방법이 궁금합니다.

전의:

Posted On April 6th By Some Dude

하위 문자열 "By"를 포함하여 그 이후의 모든 텍스트를 제거하도록하고 싶습니다.

감사


1
하위 문자열이 두 번 이상 발생하면 어떻게됩니까?
Bart Kiers

18
다른 사람의 내용을 가지고 자신의 사이트에 그것을 제시 할 수 있도록이 일을하는 경우 그냥 참고로, 하지 않습니다 .
ceejayoz

ceejayoz에 동의합니다. 실제로 액세스 할 수없는 콘텐츠를 사용하려고하거나 원래 작성자에 대한 참조를 제거하려고하는 것처럼 들립니다. 그다지 좋지 않을 것입니다 ...
selfawaresoup


1
CMS에 의해 생성 된 컨텐트로 작업 할 때 합법적 인 이유로 이런 종류의 작업을 수행하는 것이 실제로 일반적입니다. 업데이트를 깨뜨리기 때문에 이와 같은 스 니펫을 생성하는 실제 코드를 엉망으로 만들고 싶지 않기 때문입니다. 그래서 당신은 그 일을하게 한 다음 당신의 일을합니다.
Nosajimiki

답변:


292
$variable = substr($variable, 0, strpos($variable, "By"));

평범한 영어로 : 시작 부분에서 시작하여 처음에 델리 미네 이터가있는 위치에서 끝나는 부분을 알려주세요.


11
"by"가 존재하는 경우에만이 작업을 수행 할 수 있습니까?
Alisso

3
네가 옳아. "By"가 없으면 strpos는 FALSE를 반환합니다. 주어진 길이가 거짓이면 substr은 빈 문자열을 반환합니다. 실제로 "By"가 존재하는지 확인한 다음 존재하는 경우에만 수행하는 것이 좋습니다 (그렇지 않으면 문자열 만 그대로 두는 것).
Austin Fitzpatrick

13
이것은 작동합니다 : strpos ($ variable, "By")? substr ($ variable, 0, strpos ($ variable, "By")) : $ 변수;
노아 게리

나는 아래의 모든 것을 다루고 대소 문자를 구분하지 않고, 여러 번 발생하고, 정규 표현식과 같은 모든 종류의 문제를 처리하는 방법을 설명한다고 생각합니다. 더 유연한 작업을 원하거나 들어오는 입력을 제어 할 수없는 사람은 체크 아웃 할 가치가 있습니다.
azoundria

1
@Goahnary를 위해 완벽하게 작동합니다!
데니스

106

PHP 5.3 이상을 사용하는 경우 strstr () 의 $ before_needle 플래그를 살펴보십시오

$s = 'Posted On April 6th By Some Dude';
echo strstr($s, 'By', true);

4
고마워 요즘 이것은 실제 정답입니다 !
Matmarbon

59
FALSE문자열의 일부를 찾지 못하면 반환 됩니다. 해결책은 다음과 같습니다.echo strstr($s, 'By', true) ?: $s;
kenorb

6
^^^ kenorb의 답변은 오늘 수락 된 답변이어야합니다. 또 다른 대안은 squarecandy의 explode(' By', $s)[0]IMHO 일 것입니다.
Zack Morris

실제로 kenorb의 존재 확인은 문자열을 테스트 할 필요는 없지만 수행하는 방법입니다.
BarryMode

@kenorb의 방법은 가슴입니다.
Quinn Comendant

32

사용 방법 explode:

$input = 'Posted On April 6th By Some Dude';
$result = explode(' By',$input);
return $result[0];

장점 :


@bkac-작동하고 감가 상각되지 않는 한 구식의 문제점은 무엇입니까?
squarecandy

3
이렇게하면 허용 된 대답에 필요한 구분 기호 문자열이 있는지 추가 검사 할 필요가 없습니다.
David Cullen

17

당신은 할 수 있습니다 :

$posted = preg_replace('/ By.*/', '', $posted);
echo $posted;

4
+1 제어 문자가없는 경우 작동하는 유일한 것입니다 (제어 문자가 소스 문자열에없는 경우 빈 문자열을 반환하는 다른 문자와 달리)
Tom Auger

9

한 가지 방법은 다음과 같습니다.

$str = 'Posted On April 6th By Some Dude';
echo strtok($str, 'By'); // Posted On April 6th

By가 문자열에없는 경우에도 작동하는 최선의 대답입니다 .substr 응답은 존재하지 않기 때문에 실패합니다.
neoteknic

이것은 잘못된 것입니다 : 함수는로 나뉘 지 않고 By두 번째 매개 변수의 모든 문자로 나뉩니다 . 즉, B또는로 분할됩니다 y. 기술적으로, 전에 모든 것을 얻지는 못합니다 By.
msb

주의 : strtok은 문자열 의 첫 번째 문자 인 경우 문자열 의 문자열 부분을 반환합니다 . 예를 들어, 예상 한대로 빈 문자열 이 아니라 strtok('a:b', ':')반환 a하지만 strtok(':b', ':')반환 b합니다.
Quinn Comendant

6

이 시도.

function strip_after_string($str,$char)
    {
        $pos=strpos($str,$char);    
        if ($pos!==false) 
        {
            //$char was found, so return everything up to it.
            return substr($str,0,$pos);
        } 
        else 
        {
            //this will return the original string if $char is not found.  if you wish to return a blank string when not found, just change $str to ''
            return $str; 
        }
    }

용법:

<?php
    //returns Apples
    $clean_string= strip_after_string ("Apples, Oranges, Banannas",",");
?>

sas 대신 strip_after_string 함수의 이름을 지정하고 암호 초기로 가득 찬 코드베이스를 사용하는 것이 훨씬 좋습니다. 이것은이 질문에 가장 좋아하는 대답입니다.
Anther

5

Austin의 답변은 귀하의 사례에 적합합니다.

더 일반적으로 분할하는 하위 문자열이 문자열마다 다를 수있는 경우 정규식 함수 를 살펴 보는 것이 좋습니다.

$ variable = preg_replace ( '/ By. * /', '', $ variable);

+1, 맞습니다. "저자 :"또는 "저자 :"또는 "동의 함과 함께 사용함"으로 나누려면 정규식을 만드는 것이 가장 쉬울 것입니다. 그래도 정규식 논리를 수행하지 않으면 코드에 최소한의 복잡성을 즉시 추가하는 것처럼 보이기 때문에 피하는 경향이 있습니다.
Austin Fitzpatrick

4

사용 listexplode기능 :

list($result) = explode("By", "Posted On April 6th By Some Dude", 2);
// $result is "Posted On April 6th "

이것이 가장 정확합니다. 내가 이것을 두 번 투표 할 수 있기를 바란다
John Max

4
$var = "Posted On April 6th By Some Dude";
$new_var = substr($var, 0, strpos($var, " By"));


2

정규식을 사용하여 : $string = preg_replace('/\s+By.*$/', '', $string)


이 코드 전용 답변에 설명을 포함하십시오.
mickmackusa

2

다음은 문자열에서 첫 번째 By 이후의 모든 항목을 잘라내는 가장 효율적인 방법 (런타임 별) 입니다. 경우 에 의해이 존재하지 않는, 전체 문자열이 반환됩니다. 결과는 $ sResult입니다.

$sInputString = "Posted On April 6th By Some Dude";
$sControl = "By";

//Get Position Of 'By'
$iPosition = strpos($sInputString, " ".$sControl);
if ($iPosition !== false)
  //Cut Off If String Exists
  $sResult = substr($sInputString, 0, $iPosition);
else
  //Deal With String Not Found
  $sResult = $sInputString;

//$sResult = "Posted On April 6th"

대소 문자를 구분하지 않으려면 strpos 대신 stripos 를 사용 하십시오. By 가 두 번 이상 존재할 수 있다고 생각 하고 마지막 발생 후 모든 것을 잘라내려면 strrpos를 사용하십시오 .

아래는 덜 효율적인 방법이지만 코드 공간을 덜 차지합니다. 이 방법은 더욱 유연하며 정규 표현식을 수행 할 수 있습니다.

$sInputString = "Posted On April 6th By Some Dude";
$pControl = "By";

$sResult = preg_replace("' ".$pControl.".*'s", '', $sInputString);

//$sResult = "Posted On April 6th"

예를 들어, 하루 후에 모든 것을 제거하려면 다음을 수행하십시오.

$sInputString = "Posted On April 6th By Some Dude";
$pControl = "[0-9]{1,2}[a-z]{2}"; //1 or 2 numbers followed by 2 lowercase letters.

$sResult = preg_replace("' ".$pControl.".*'s", '', $sInputString);

//$sResult = "Posted On April"

대소 문자를 구분하지 않으려면 다음과 같이 i 수정자를 추가하십시오.

$sResult = preg_replace("' ".$pControl.".*'si", '', $sInputString);

마지막 지나 모든 것을 얻으려면 둘 이상이 있다고 생각되면 처음에 다음과 같이. *를 추가하십시오.

$sResult = preg_replace("'.* ".$pControl.".*'si", '', $sInputString);

그러나 preg_match를 사용하여 수행하려는 작업을 수행 할 수있는 강력한 방법도 있습니다.

$sInputString = "Posted On April 6th By Some Dude";

$pPattern = "'Posted On (.*?) By (.*?)'s";
if (preg_match($pPattern, $sInputString, $aMatch)) {
  //Deal With Match
  //$aMatch[1] = "April 6th"
  //$aMatch[2] = "Some Dude"
} else {
  //No Match Found
}

정규 표현식은 처음에는 혼란스러워 보일 수 있지만 일단 마스터하면 가장 강력하고 친한 친구가 될 수 있습니다! 행운을 빕니다!


1

왜...

이것은 대부분의 사람들의 요구에 과잉 일 수 있지만, 위의 각 개인이 대답하지 않은 많은 것들을 다룹니다. 그것이 다루는 항목들 중 세 가지가 내 필요에 필요했습니다. 괄호를 묶고 주석을 삭제하면 여전히 13 줄의 코드로 읽을 수 있습니다.

이것은 다음을 해결합니다.

  • REGEX와 strrpos / strstr / strripos / stristr의 성능 영향.
  • 문자열에서 문자 / 문자열을 찾을 수 없을 때 strripos / strrpos 사용
  • 문자열의 왼쪽 또는 오른쪽에서 제거 (첫 번째 또는 마지막 항목).
  • CaSe 감도.
  • 검색 문자 / 문자열을 찾을 수없는 경우 원래 문자열을 변경하지 않고 되돌릴 수 있기를 원합니다.

용법:

원본 문자열, 검색 문자 / 문자열, "R"/ "L"을 시작하여 오른쪽 또는 왼쪽에서 시작하고 대 / 소문자 구분을 위해 true / false를 보냅니다. 예를 들어, 문자열에서 "여기"대소 문자를 구분하지 않고 오른쪽에서 시작하십시오.

echo TruncStringAfterString("Now Here Are Some Words Here Now","here","R",false);

결과는 "이제 몇 단어들"입니다. "R"을 "L"로 변경하면 "Now"가 출력됩니다.

기능은 다음과 같습니다.

function TruncStringAfterString($origString,$truncChar,$startSide,$caseSensitive)
{
    if ($caseSensitive==true && strstr($origString,$truncChar)!==false)
    {
        // IF START RIGHT SIDE:
        if (strtoupper($startSide)=="R" || $startSide==false)
        {   // Found, strip off all chars from truncChar to end
            return substr($origString,0,strrpos($origString,$truncChar));
        }

        // IF START LEFT SIDE: 
        elseif (strtoupper($startSide)=="L" || $startSide="" || $startSide==true)
        {   // Found, strip off all chars from truncChar to end
            return strstr($origString,$truncChar,true);
        }           
    }
    elseif ($caseSensitive==false && stristr($origString,$truncChar)!==false)
    {           
        // IF START RIGHT SIDE: 
        if (strtoupper($startSide)=="R" || $startSide==false)
        {   // Found, strip off all chars from truncChar to end
            return substr($origString,0,strripos($origString,$truncChar));
        }

        // IF START LEFT SIDE: 
        elseif (strtoupper($startSide)=="L" || $startSide="" || $startSide==true)
        {   // Found, strip off all chars from truncChar to end
            return stristr($origString,$truncChar,true);
        }
    }       
    else
    {   // NOT found - return origString untouched
        return $origString;     // Nothing to do here
    }           

}

당신이 내 대답을 downvote하면, 당신이 이유를 말한 것에 감사드립니다.
Robert Mauro

0

strstr 함수를 사용하십시오 .

<?php
$myString = "Posted On April 6th By Some Dude";
$result = strstr($myString, 'By', true);

echo $result ;

세 번째 매개 변수 true는 두 번째 매개 변수 가 처음 발생하기 전에 모든 것을 반환하도록 함수에 지시합니다.


1
strtok($str, 'By')더 단순 해 보인다
mu3

-2
$variable = substr($initial, 0, strpos($initial, "By"));

if (!empty($variable)) { echo $variable; } else { echo $initial; }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.