Удалить часть строки после определенного символа

Мне просто интересно, как я могу удалить все после определенной подстроки в PHP

Пример:

Posted On April 6th By Some Dude

Я хотел бы иметь его так, чтобы он удалял весь текст, включая и после, подстроку "By"

Спасибо

Ответ 1

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

В простом английском: дайте мне часть строки, начиная с начала и заканчивая в том месте, где вы впервые сталкиваетесь с разделителем.

Ответ 2

Если вы используете PHP 5.3+, посмотрите флаг $before_needle strstr()

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

Ответ 3

Как насчет использования explode:

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

Преимущества:

Ответ 4

Вы можете сделать:

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

Ответ 5

Один из методов:

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

Ответ 7

Попробуйте это.

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",",");
?>

Ответ 8

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

Ответ 9

preg_replace предлагает один из способов:

$newText = preg_replace('/\bBy.*$/', '', $text);

Ответ 10

Используя регулярное выражение: $string = preg_replace('/\s+By.*$/', '', $string)

Ответ 11

Вы можете использовать list и explode функции:

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

Ответ 12

Ниже приведен самый эффективный метод (по времени выполнения), чтобы отрезать все после первого By в строке. Если 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"

Если вы не хотите быть чувствительным к регистру, используйте stripos вместо strpos. Если вы думаете, что 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"

Для нечувствительности к регистру добавьте модификатор я следующим образом:

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

Регулярные выражения могут показаться запутанными сначала, но они могут быть действительно мощными и вашим лучшим другом, когда вы овладеете ими! Удачи!

Ответ 13

Используйте функцию strstr.

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

echo $result ;

Третий параметр true сообщает функции вернуть все до первого появления второго параметра.

Ответ 14

Зачем...

Это, вероятно, излишне для большинства людей, но оно затрагивает ряд вещей, которые не дает каждый отдельный ответ выше. Из предметов, которые он рассматривает, три из них были необходимы для моих нужд. С жесткими скобками и отбрасыванием комментариев, он все еще может оставаться читаемым всего в 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", то получится: "Сейчас".

Здесь функция:

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
    }           

}

Ответ 15

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

if (!empty($variable)) { echo $variable; } else { echo $initial; }