Удалить часть строки после определенного символа
Мне просто интересно, как я могу удалить все после определенной подстроки в PHP
ex:
Posted On April 6th By Some Dude
Я хотел бы иметь его так, чтобы он удалял весь текст, включая и после, подстроку "By"
спасибо
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];
плюсы:
- очень читаемый / приемлимые
- возвращает полную строку, если разделитель строки (" By" в данном примере) отсутствует. (Не будет возвращать FALSE, как и некоторые другие ответы.)
- не требует никаких регулярных выражений.
- "регулярные выражения похожи на особенно острый острый соус – должны использоваться в умеренных количествах и с ограничением только тогда, когда соответствующий."
- регулярное выражение медленнее, чем взорваться (я предполагаю, что preg_split похож по скорости на другие варианты регулярных выражений, предложенные в других ответах)
- делает вторую часть строки доступной тоже, если вам это нужно (
$result[1]
вернутсяSome Dude
в этом примере)
ответ Остина работает для вашего примера.
в более общем плане, вам было бы неплохо заглянуть в функции регулярных выражений когда подстрока, которую вы разделяете, может отличаться между строками:
$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",","); ?>
preg_replace
одним из способов:$newText = preg_replace('/\bBy.*$/', '', $text);
Ниже приведен наиболее эффективный метод (по времени выполнения), чтобы отрезать все после первого 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 }
регулярные выражения могут показаться запутанными на первый взгляд, но они могут быть действительно мощными и вашим лучшим другом, как только вы овладеете ими! Удачи вам!
использовать strstr