177 votes

Supprime la partie d'une chaîne après un certain caractère

Je me demande comment je peux supprimer tout ce qui suit une certaine sous-chaîne en PHP.

ex :

Posted On April 6th By Some Dude

Je voudrais qu'il supprime tout le texte incluant et suivant la sous-chaîne "By".

Merci

8voto

Tim Yobson Points 81

Essayez ça.

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

Utilisation :

<?php
    //returns Apples
    $clean_string= strip_after_string ("Apples, Oranges, Banannas",",");
?>

6voto

jemfinch Points 2149

La réponse d'Austin fonctionne pour votre exemple de cas.

De manière plus générale, vous feriez bien de vous pencher sur la question des fonctions d'expression régulière lorsque la sous-chaîne sur laquelle vous effectuez le fractionnement peut être différente d'une chaîne à l'autre :

$variable = preg\_replace('/By.\*/', '', $variable);

4voto

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

4voto

Salman A Points 60620

Vous pouvez utiliser list et explode fonctions :

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

2voto

outis Points 39377

preg_replace offre un moyen :

$newText = preg_replace('/\bBy\b.*$/', '', $text);

Le \b ' correspond à la limite d'un mot (il est de largeur zéro et correspond entre les caractères du mot et ceux qui ne le sont pas), ce qui garantit qu'il ne correspondra qu'à un mot complet. Bien que le mot cible ne fasse partie d'aucun autre mot dans l'exemple, il peut généralement apparaître comme partie d'un autre mot (par exemple, "by" dans "Babylon Revisited", de F. Scott Fitzgerald, ou "Bloom County Babylon" de Berkely Breathed).

Le '.*$' correspond à tout le texte jusqu'à la fin. Le '$' correspond à la fin de la chaîne et, bien que cela ne soit pas strictement nécessaire pour l'exactitude, documente l'intention de la regex (qui est bien connue pour devenir difficile à lire).

La correspondance des expressions régulières commence au début de la chaîne de caractères, ce qui signifie que le remplacement se fera à partir de la première correspondance. Pour savoir comment remplacer la correspondance en commençant par la dernière, voir " Comment remplacer uniquement la dernière correspondance d'une chaîne avec preg_replace ? "

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X