Mi sto solo chiedendo come potrei rimuovere tutto dopo una certa sottostringa in PHP
ex:
Posted On April 6th By Some Dude
Mi piacerebbe averlo in modo che rimuova tutto il testo tra cui, e dopo, la sotto stringa "By"
Grazie
Mi sto solo chiedendo come potrei rimuovere tutto dopo una certa sottostringa in PHP
ex:
Posted On April 6th By Some Dude
Mi piacerebbe averlo in modo che rimuova tutto il testo tra cui, e dopo, la sotto stringa "By"
Grazie
Risposte:
$variable = substr($variable, 0, strpos($variable, "By"));
In parole povere: dammi la parte della stringa che inizia all'inizio e termina nella posizione in cui incontri il deliminatore.
Se stai usando PHP 5.3+ dai un'occhiata al flag $ before_needle di strstr ()
$s = 'Posted On April 6th By Some Dude';
echo strstr($s, 'By', true);
FALSE
se non viene trovata la parte di stringa. Quindi la soluzione potrebbe essere:echo strstr($s, 'By', true) ?: $s;
explode(' By', $s)[0]
IMHO di Squarecandy
Che ne dici di usare explode
:
$input = 'Posted On April 6th By Some Dude';
$result = explode(' By',$input);
return $result[0];
vantaggi:
$result[1]
ritornerebbe Some Dude
in questo esempio)Potresti fare:
$posted = preg_replace('/ By.*/', '', $posted);
echo $posted;
Un metodo sarebbe:
$str = 'Posted On April 6th By Some Dude';
echo strtok($str, 'By'); // Posted On April 6th
By
, ma per qualsiasi carattere nel secondo parametro. Significato, si dividerà per B
o y
. Tecnicamente, non sta ottenendo tutto prima di a By
.
strtok('a:b', ':')
tornerà a
ma strtok(':b', ':')
restituirà b
, non una stringa vuota come ti aspetteresti.
Prova questo.
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;
}
}
Uso:
<?php
//returns Apples
$clean_string= strip_after_string ("Apples, Oranges, Banannas",",");
?>
La risposta di Austin funziona per il tuo esempio.
Più in generale, faresti bene a esaminare le funzioni delle espressioni regolari quando la sottostringa su cui stai suddividendo può differire tra le stringhe:
$ variabile = preg_replace ('/ By. * /', '', $ variabile);
$var = "Posted On April 6th By Some Dude";
$new_var = substr($var, 0, strpos($var, " By"));
preg_replace
offre un modo:
$newText = preg_replace('/\bBy.*$/', '', $text);
Usando l'espressione regolare: $string = preg_replace('/\s+By.*$/', '', $string)
Di seguito è riportato il metodo più efficiente (per run-time) per tagliare tutto dopo il primo By in una stringa. Se By non esiste, viene restituita la stringa completa. Il risultato è in $ 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"
Se non vuoi fare distinzione tra maiuscole e minuscole, usa stripos invece di strpos. Se pensi che By possa esistere più di una volta e desideri tagliare tutto dopo l'ultima occorrenza, usa strrpos .
Di seguito è riportato un metodo meno efficiente ma occupa meno spazio nel codice. Questo metodo è anche più flessibile e ti consente di fare qualsiasi espressione regolare.
$sInputString = "Posted On April 6th By Some Dude";
$pControl = "By";
$sResult = preg_replace("' ".$pControl.".*'s", '', $sInputString);
//$sResult = "Posted On April 6th"
Ad esempio, se si desidera rimuovere tutto dopo il giorno:
$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"
Per la distinzione tra maiuscole e minuscole, aggiungi il modificatore i in questo modo:
$sResult = preg_replace("' ".$pControl.".*'si", '', $sInputString);
Per ottenere tutto ciò oltre l'ultima Con se si pensa che ci potrebbe essere più di uno, aggiungere un ulteriore * all'inizio come questo.:
$sResult = preg_replace("'.* ".$pControl.".*'si", '', $sInputString);
Ma qui è anche un modo davvero potente che puoi usare preg_match per fare quello che potresti provare a fare:
$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
}
Le espressioni regolari all'inizio possono sembrare confuse, ma possono essere davvero potenti e il tuo migliore amico una volta che le padroni! In bocca al lupo!
Perché...
Questo è probabilmente eccessivo per le esigenze della maggior parte delle persone, ma affronta una serie di cose che ogni singola risposta sopra non risponde. Degli articoli a cui si rivolge, tre erano necessari per le mie esigenze. Con il bracketing stretto e la caduta dei commenti, questo potrebbe rimanere leggibile a sole 13 righe di codice.
Questo risolve quanto segue:
Uso:
Invia stringa originale, cerca carattere / stringa, "R" / "L" per inizio sul lato destro o sinistro, vero / falso per la distinzione tra maiuscole e minuscole. Ad esempio, cerca "qui" senza distinzione tra maiuscole e minuscole, nella stringa, inizia dal lato destro.
echo TruncStringAfterString("Now Here Are Some Words Here Now","here","R",false);
L'output sarebbe "Now Here Are Some Words". Cambiando la "R" in una "L" si otterrebbe: "Now".
Ecco la funzione:
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
}
}