Удалить часть строки после определенного символа - PullRequest
118 голосов
/ 07 апреля 2010

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

ex:

Posted On April 6th By Some Dude

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

Спасибо

Ответы [ 15 ]

239 голосов
/ 07 апреля 2010
$variable = substr($variable, 0, strpos($variable, "By"));

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

90 голосов
/ 07 апреля 2010

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

$s = 'Posted On April 6th By Some Dude';
echo strstr($s, 'By', true);
26 голосов
/ 15 августа 2013

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

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

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

17 голосов
/ 07 апреля 2010

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

$posted = preg_replace('/ By.*/', '', $posted);
echo $posted;
7 голосов
/ 02 декабря 2015

Один метод будет:

$str = 'Posted On April 6th By Some Dude';
echo strtok($str, 'By'); // Posted On April 6th
5 голосов
/ 19 марта 2017

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

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",",");
?>
5 голосов
/ 07 апреля 2010

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

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

$variable = preg_replace('/By.*/', '', $variable);
3 голосов
/ 07 апреля 2010
$var = "Posted On April 6th By Some Dude";
$new_var = substr($var, 0, strpos($var, " By"));
2 голосов
/ 23 августа 2017

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

Чтобы получить все, что осталось за последним К , если вы думаете, что их может быть больше одного, добавьте дополнительный. * В начале, например:

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

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

2 голосов
/ 23 декабря 2014

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

list($result) = explode("By", "Posted On April 6th By Some Dude", 2);
// $result is "Posted On April 6th "
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...