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.