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


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

ex:

Posted On April 6th By Some Dude

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

спасибо

13 100

13 ответов:

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

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

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

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

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

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

плюсы:

вы могли бы сделать:

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

ответ Остина работает для вашего примера.

в более общем плане, вам было бы неплохо заглянуть в функции регулярных выражений когда подстрока, которую вы разделяете, может отличаться между строками:

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

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

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

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

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",",");
?>
$var = "Posted On April 6th By Some Dude";
$new_var = substr($var, 0, strpos($var, " By"));

preg_replace одним из способов:

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

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

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

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

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

чтобы все прошло мимо последнего By если вы думаете, что может быть больше, чем один, добавьте дополнительный .* в начале вот так:

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

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

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

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

использовать strstr