Zastanawiam się tylko, jak mogę usunąć wszystko po pewnym podciągu w PHP
dawny:
Posted On April 6th By Some Dude
Chciałbym, aby usuwał cały tekst, w tym podłańcuch „By” i po nim
Dzięki
Zastanawiam się tylko, jak mogę usunąć wszystko po pewnym podciągu w PHP
dawny:
Posted On April 6th By Some Dude
Chciałbym, aby usuwał cały tekst, w tym podłańcuch „By” i po nim
Dzięki
Odpowiedzi:
$variable = substr($variable, 0, strpos($variable, "By"));
Mówiąc prostym językiem: podaj mi część ciągu zaczynającą się od początku i kończącą się w miejscu, w którym po raz pierwszy napotkasz separator.
Jeśli używasz PHP 5.3+, spójrz na flagę $ before_needle funkcji strstr ()
$s = 'Posted On April 6th By Some Dude';
echo strstr($s, 'By', true);
FALSE
jeśli część ciągu nie zostanie znaleziona. Tak więc rozwiązaniem mogłoby być:echo strstr($s, 'By', true) ?: $s;
explode(' By', $s)[0]
IMHO Squarecandy
Co powiesz na używanie explode
:
$input = 'Posted On April 6th By Some Dude';
$result = explode(' By',$input);
return $result[0];
Zalety:
$result[1]
zwróci Some Dude
w tym przykładzie)Jedną z metod byłoby:
$str = 'Posted On April 6th By Some Dude';
echo strtok($str, 'By'); // Posted On April 6th
By
, ale według dowolnego znaku w drugim parametrze. Oznacza to, że zostanie podzielony na jeden B
lub y
. Technicznie rzecz biorąc, nie uzyskuje się wszystkiego przed By
.
strtok('a:b', ':')
powróci a
ale strtok(':b', ':')
wróci b
, nie pusty ciąg jak można się spodziewać.
Spróbuj tego.
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;
}
}
Stosowanie:
<?php
//returns Apples
$clean_string= strip_after_string ("Apples, Oranges, Banannas",",");
?>
Odpowiedź Austina działa w twoim przykładowym przypadku.
Mówiąc bardziej ogólnie, dobrze byłoby przyjrzeć się funkcjom wyrażeń regularnych, gdy podciąg, na którym dzielisz, może różnić się między łańcuchami:
$ zmienna = preg_replace ('/ By. * /', '', $ zmienna);
$var = "Posted On April 6th By Some Dude";
$new_var = substr($var, 0, strpos($var, " By"));
preg_replace
oferuje w jedną stronę:
$newText = preg_replace('/\bBy.*$/', '', $text);
Używając wyrażenia regularnego: $string = preg_replace('/\s+By.*$/', '', $string)
Poniżej znajduje się najbardziej wydajna metoda (według czasu wykonywania) odcinania wszystkiego po pierwszym By w ciągu. Jeśli By nie istnieje, zwracany jest pełny ciąg. Wynik jest w $ 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"
Jeśli nie chcesz uwzględniać wielkości liter, użyj stripos zamiast strpos. Jeśli uważasz, że By może istnieć więcej niż raz i chcesz wyciąć wszystko po ostatnim wystąpieniu, użyj strrpos .
Poniżej znajduje się mniej wydajna metoda, ale zajmuje mniej miejsca na kod. Ta metoda jest również bardziej elastyczna i umożliwia wykonanie dowolnego wyrażenia regularnego.
$sInputString = "Posted On April 6th By Some Dude";
$pControl = "By";
$sResult = preg_replace("' ".$pControl.".*'s", '', $sInputString);
//$sResult = "Posted On April 6th"
Na przykład, jeśli chcesz usunąć wszystko po dniu:
$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"
Aby nie rozróżniać wielkości liter, dodaj modyfikator i w następujący sposób:
$sResult = preg_replace("' ".$pControl.".*'si", '', $sInputString);
Aby dostać wszystko za ostatnim By jeśli uważasz, że może być więcej niż jeden, dodać dodatkową * na początku tak.:
$sResult = preg_replace("'.* ".$pControl.".*'si", '', $sInputString);
Ale tutaj jest również naprawdę potężny sposób, w jaki możesz użyć preg_match do zrobienia tego, co prawdopodobnie próbujesz zrobić:
$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
}
Wyrażenia regularne mogą początkowo wydawać się zagmatwane, ale mogą być naprawdę potężne i być najlepszym przyjacielem, gdy je opanujesz! Powodzenia!
Czemu...
Jest to prawdopodobnie przesada dla większości ludzi, ale dotyczy wielu rzeczy, których nie dotyczy każda z powyższych odpowiedzi. Z pozycji, których dotyczy, trzy były potrzebne do moich potrzeb. Przy ścisłym nawiasach klamrowych i porzucaniu komentarzy może to być nadal czytelne przy zaledwie 13 liniach kodu.
Dotyczy to następujących kwestii:
Stosowanie:
Wyślij oryginalny ciąg, wyszukaj znak / ciąg, „R” / „L”, aby rozpocząć po prawej lub lewej stronie, prawda / fałsz, aby uwzględnić wielkość liter. Na przykład wyszukaj „tutaj” bez rozróżniania wielkości liter, w ciągu znaków zacznij od prawej strony.
echo TruncStringAfterString("Now Here Are Some Words Here Now","here","R",false);
Rezultatem byłoby „Teraz oto kilka słów”. Zmiana „R” na „L” spowoduje wyświetlenie: „Teraz”.
Oto funkcja:
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
}
}