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

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

например:

Posted On April 6th By Some Dude 

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

благодаря

 $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]; 

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

  • Очень читаемый / понятный
  • Возвращает полную строку, если строка разделителя («By» в этом примере) отсутствует. (Не будет возвращать FALSE, как некоторые другие ответы).
  • Не требует никакого регулярного выражения.
    • «Регулярные выражения похожи на особенно острый горячий соус – для умеренного использования и сдержанности только тогда, когда это необходимо».
    • Regex медленнее, чем взорваться (я полагаю, preg_split похож по скорости на другие варианты регулярных выражений, предложенные в других ответах)
  • Делает вторую часть строки доступной, если она вам нужна ( $result[1] вернет Some Dude в этом примере)

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

 $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")); 

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

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

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

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

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

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

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

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

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

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