Rimuovi parte di una stringa dopo un certo carattere


144

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


1
Cosa succede se la stringa secondaria si verifica due volte (o più)?
Bart Kiers,

18
Proprio come una nota, se lo stai facendo in modo da poter prendere il contenuto di qualcun altro e presentarlo sul tuo sito, non farlo .
Ceejayoz,

Sono d'accordo con ceejayoz. Questo suona molto come se stessi provando a utilizzare contenuti a cui non hai realmente accesso e stai cercando di rimuovere qualsiasi riferimento all'autore originale. Non sarebbe molto bello ...
selfawaresoup

2
Ottima soluzione alternativa stackoverflow.com/a/9315908/1518921 :)
Guilherme Nascimento

1
In realtà è comune fare questo tipo di cose per motivi legittimi quando si lavora con contenuti generati da un CMS. Il motivo è che non vuoi mai sbagliare con il codice effettivo che crea uno snippet come questo perché interromperai gli aggiornamenti; quindi, lasci che faccia la sua cosa, poi fai la tua cosa.
Nosajimiki,

Risposte:


292
$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.


11
Che ne dici di "fallo solo se" per "esiste?
Alisso,

3
Hai ragione. strpos restituirà FALSE se "By" non viene trovato. substr restituirà una stringa vuota se la lunghezza fornita è falsa. In pratica sarebbe probabilmente utile verificare se "By" esiste e quindi farlo solo se lo fa (altrimenti lascia solo la stringa).
Austin Fitzpatrick,

13
Funziona: strpos ($ variabile, "Per")? substr ($ variabile, 0, strpos ($ variabile, "Per")): $ variabile;
Noah Gary,

Ho messo una risposta che penso affronta tutto sotto e spiega anche i modi per affrontare qualsiasi tipo di cose come maiuscole e minuscole, occorrenze multiple ed espressioni regolari. Se qualcuno vuole fare qualcosa di più flessibile o non ha il controllo sull'ingresso in entrata, probabilmente vale la pena dare un'occhiata.
Azoundria,

1
Funziona perfettamente per me @Goahnary!
denis,

106

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);

4
Grazie, questa è la risposta corretta al giorno d'oggi !
Matmarbon,

59
Nota che tornerà FALSEse non viene trovata la parte di stringa. Quindi la soluzione potrebbe essere:echo strstr($s, 'By', true) ?: $s;
Kenorb,

6
^^^ La risposta di Kenorb dovrebbe essere la risposta accettata oggi. un'altra alternativa sarebbe l' explode(' By', $s)[0]IMHO di Squarecandy
Zack Morris,

In effetti, il controllo dell'esistenza di kenorb è il modo per farlo, anche se non è necessario testare la stringa.
BarryMode

Solo qui per dire che il metodo di @ kenorb è quello delle tette.
Quinn Comendant

32

Che ne dici di usare explode:

$input = 'Posted On April 6th By Some Dude';
$result = explode(' By',$input);
return $result[0];

vantaggi:


@bkac - Cosa c'è che non va nel vecchio stile finché funziona e non è ammortizzato?
squarecandy,

3
Ciò elimina il controllo aggiuntivo per l'esistenza della stringa del delimitatore richiesta dalla risposta accettata.
David Cullen,

17

Potresti fare:

$posted = preg_replace('/ By.*/', '', $posted);
echo $posted;

4
+1 È l'unico che funziona se i caratteri di controllo NON sono presenti (a differenza degli altri che restituiscono una stringa vuota se i caratteri di controllo non sono presenti nella stringa di origine)
Tom Auger

9

Un metodo sarebbe:

$str = 'Posted On April 6th By Some Dude';
echo strtok($str, 'By'); // Posted On April 6th

Questa è la risposta migliore che funziona anche se By non è nella stringa, la risposta di substr è sbagliata perché non esiste e non funziona.
neoteknic,

Questo non è corretto: la funzione non verrà divisa per By, ma per qualsiasi carattere nel secondo parametro. Significato, si dividerà per Bo y. Tecnicamente, non sta ottenendo tutto prima di a By.
msb

Fai attenzione: strtok restituirà la parte della stringa dopo il carattere se è il primo carattere nella stringa, ad esempio, strtok('a:b', ':')tornerà ama strtok(':b', ':')restituirà b, non una stringa vuota come ti aspetteresti.
Quinn Comendant

6

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",",");
?>

Sarebbe molto meglio nominare la funzione strip_after_string invece di sas e avere una base di codice piena di inizializzazioni criptiche. Questa è la mia risposta preferita più leggibile a questa domanda però.
Anther,

5

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);

+1, questo è giusto. Se volessi dividere anche su "Autore:" o "Scritto da:" O "Utilizzato con il consenso di:" sarebbe probabilmente più semplice fare un'espressione regolare. Quando non faccio alcuna logica regex, tuttavia, tendo ad evitarli poiché sembrano aggiungere immediatamente un livello di complessità al codice (almeno per me)
Austin Fitzpatrick,

4

È possibile utilizzare liste explodefunzioni:

list($result) = explode("By", "Posted On April 6th By Some Dude", 2);
// $result is "Posted On April 6th "

Questo è il più preciso. Come vorrei poter votare due volte
John Max,

4
$var = "Posted On April 6th By Some Dude";
$new_var = substr($var, 0, strpos($var, " By"));


2

Usando l'espressione regolare: $string = preg_replace('/\s+By.*$/', '', $string)


Si prega di includere alcune spiegazioni con questa risposta di solo codice.
mickmackusa,

2

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!


1

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:

  • Impatto sulle prestazioni dell'utilizzo di REGEX vs strrpos / strstr / strripos / stristr.
  • Uso di strripos / strrpos quando carattere / stringa non trovato nella stringa.
  • Rimozione dal lato sinistro o destro della stringa (prima o ultima occorrenza).
  • Sensibilità CaSe.
  • Volendo la possibilità di restituire la stringa originale inalterata se il carattere / stringa di ricerca non viene trovato.

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
    }           

}

Se declassate la mia risposta di lavoro, vi saremmo grati se aveste dichiarato il perché.
Robert Mauro,

0

Utilizzare la funzione strstr .

<?php
$myString = "Posted On April 6th By Some Dude";
$result = strstr($myString, 'By', true);

echo $result ;

Il terzo parametro truedice alla funzione di restituire tutto prima della prima occorrenza del secondo parametro.


1
strtok($str, 'By')sembra più semplice
mu3

-2
$variable = substr($initial, 0, strpos($initial, "By"));

if (!empty($variable)) { echo $variable; } else { echo $initial; }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.