Мне просто интересно, как я могу удалить все после определенной подстроки в 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];
Преимущества:
$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 }
Регулярные выражения могут показаться запутанными сначала, но они могут быть действительно мощными и вашим лучшим другом, как только вы овладеете ими! Удачи!