Мне просто интересно, как я могу удалить все после определенной подстроки в 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);
Как насчет использования 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
Ответ на Остин работает для вашего примера.
В более общем плане вам следовало бы изучить функции регулярных выражений когда подстрока, которую вы разделяете, может различаться между строками:
$variable = preg_replace('/By.*/', '', $variable);
Попробуйте это.
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"));
preg_replace
предлагает один из способов:
$newText = preg_replace('/\bBy.*$/', '', $text);
Используя регулярное выражение: $string = preg_replace('/\s+By.*$/', '', $string)
Вы можете использовать list
и explode
функции:
list($result) = explode("By", "Posted On April 6th By Some Dude", 2);
// $result is "Posted On April 6th "
Ниже приведен самый эффективный метод (по времени выполнения), чтобы отрезать все после первого 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"
Для нечувствительности к регистру добавьте модификатор я следующим образом:
$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
}
Регулярные выражения могут показаться запутанными сначала, но они могут быть действительно мощными и вашим лучшим другом, когда вы овладеете ими! Удачи!
Используйте функцию strstr.
<?php
$myString = "Posted On April 6th By Some Dude";
$result = strstr($myString, 'By', true);
echo $result ;
Третий параметр true
сообщает функции вернуть все до первого появления второго параметра.
Зачем...
Это, вероятно, излишне для большинства людей, но оно затрагивает ряд вещей, которые не дает каждый отдельный ответ выше. Из предметов, которые он рассматривает, три из них были необходимы для моих нужд. С жесткими скобками и отбрасыванием комментариев, он все еще может оставаться читаемым всего в 13 строках кода.
Это касается следующего:
Использование:
Отправьте исходную строку, найдите символ/строку, "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
}
}
$variable = substr($initial, 0, strpos($initial, "By"));
if (!empty($variable)) { echo $variable; } else { echo $initial; }