Мне просто интересно, как я могу удалить все после определенной подстроки в PHP
пример:
Posted On April 6th By Some Dude
Я бы хотел, чтобы он удалял весь текст, включая и после подстроки "By"
Благодарность
Мне просто интересно, как я могу удалить все после определенной подстроки в 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);
FALSE
если часть строки не найдена. Таким образом, решение может быть таким:echo strstr($s, 'By', true) ?: $s;
explode(' By', $s)[0]
ИМХО от Squarecandy
Как насчет использования 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;
Один из способов:
$str = 'Posted On April 6th By Some Dude';
echo strtok($str, 'By'); // Posted On April 6th
By
, а по любому символу во втором параметре. Это означает, что он будет разделен на B
или y
. Технически, это не все до By
.
strtok('a:b', ':')
вернет, a
но strtok(':b', ':')
вернет b
, а не пустую строку, как вы ожидали.
Попробуй это.
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",",");
?>
Ответ Остина работает для вашего примера.
В более общем плане вам следует изучить функции регулярных выражений, когда подстрока, которую вы разделяете, может различаться между строками:
$ variable = preg_replace ('/ By. * /', '', $ variable);
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
}
Поначалу регулярные выражения могут показаться запутанными, но они могут быть действительно мощными и вашими лучшими друзьями, когда вы их освоите! Удачи!
Зачем...
Это, вероятно, излишне для нужд большинства людей, но оно касается ряда вещей, которых нет в каждом отдельном ответе выше. Из пунктов, которые он адресовал, три из них были необходимы для моих нужд. С жесткими скобками и отбрасыванием комментариев это все еще могло оставаться читаемым всего на 13 строках кода.
Это касается следующего:
Применение:
Отправьте исходную строку, поиск char / string, "R" / "L" для начала справа или слева, true / false для чувствительности к регистру. Например, поиск «здесь» без учета регистра в строке, начало с правой стороны.
echo TruncStringAfterString("Now Here Are Some Words Here Now","here","R",false);
Результатом будет «Вот несколько слов». Замена «R» на «L» приведет к выводу: «Сейчас».
Вот функция:
function TruncStringAfterString($origString,$truncChar,$startSide,$caseSensitive)
{
if ($caseSensitive==true && strstr($origString,$truncChar)!==false)
{
// IF START RIGHT SIDE:
if (strtoupper($startSide)=="R" || $startSide==false)
{ // Found, strip off all chars from truncChar to end
return substr($origString,0,strrpos($origString,$truncChar));
}
// IF START LEFT SIDE:
elseif (strtoupper($startSide)=="L" || $startSide="" || $startSide==true)
{ // Found, strip off all chars from truncChar to end
return strstr($origString,$truncChar,true);
}
}
elseif ($caseSensitive==false && stristr($origString,$truncChar)!==false)
{
// IF START RIGHT SIDE:
if (strtoupper($startSide)=="R" || $startSide==false)
{ // Found, strip off all chars from truncChar to end
return substr($origString,0,strripos($origString,$truncChar));
}
// IF START LEFT SIDE:
elseif (strtoupper($startSide)=="L" || $startSide="" || $startSide==true)
{ // Found, strip off all chars from truncChar to end
return stristr($origString,$truncChar,true);
}
}
else
{ // NOT found - return origString untouched
return $origString; // Nothing to do here
}
}