Мені просто цікаво, як я міг видалити все після певної підрядки в PHP
колишній:
Posted On April 6th By Some Dude
Мені б хотілося, щоб він видалив увесь текст, включаючи і після, підряд рядок "За"
Дякую
Мені просто цікаво, як я міг видалити все після певної підрядки в PHP
колишній:
Posted On April 6th By Some Dude
Мені б хотілося, щоб він видалив увесь текст, включаючи і після, підряд рядок "За"
Дякую
Відповіді:
$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]ІМХО квадратних канді
Як щодо використання explode:
$input = 'Posted On April 6th By Some Dude';
$result = explode(' By',$input);
return $result[0];
Переваги:
$result[1]повернеться Some Dudeв цьому прикладі)Одним із методів буде:
$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",",");
?>
Відповідь Остіна працює для вашого прикладу.
Більш загально, вам було б добре вивчити функції регулярного вираження коли підряд, на який ви розщеплюєте, може відрізнятися між рядками:
$ змінний = preg_replace ('/ За. * /', '', $ змінна);
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"
Якщо ви не хочете бути чутливими до регістру, використовуйте стрипоси замість стріпових. Якщо ви думаєте, що 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 рядках коду.
Це стосується наступних питань:
Використання:
Надішліть початковий рядок, рядок пошуку / рядок, "R" / "L" для початку з правого або лівого боку, істинного / помилкового для чутливості регістру. Наприклад, пошукайте "тут" нечутливі регістри, в рядку, почніть праворуч.
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
}
}