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

2voto

SHiNKiROU Points 6052

En utilisant une expression régulière : $string = preg_replace('/\s+By.*$/', '', $string)

2voto

azoundria Points 150

Voici la méthode la plus efficace (par rapport au temps d'exécution) pour couper tout ce qui se trouve après le premier Par dans une chaîne. Si Par n'existe pas, la chaîne complète est retournée. Le résultat est dans $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"

Si vous ne voulez pas être sensible à la casse, utilisez stripos au lieu de strpos. Si vous pensez Par peut exister plus d'une fois et vous voulez couper tout ce qui suit la dernière occurrence, utilisez strrpos .

La méthode ci-dessous est moins efficace, mais elle occupe moins d'espace dans le code. Cette méthode est également plus flexible et vous permet d'utiliser n'importe quelle expression régulière.

$sInputString = "Posted On April 6th By Some Dude";
$pControl = "By";

$sResult = preg_replace("' ".$pControl.".*'s", '', $sInputString);

//$sResult = "Posted On April 6th"

Par exemple, si vous vouliez tout supprimer après la journée :

$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"

Pour un traitement insensible à la casse, ajoutez le modificateur i comme suit :

$sResult = preg_replace("' ".$pControl.".*'si", '', $sInputString);

Pour que tout passe le dernier Par si vous pensez qu'il y en a plus d'un, ajoutez un .* supplémentaire au début comme ceci :

$sResult = preg_replace("'.* ".$pControl.".*'si", '', $sInputString);

Mais il existe aussi un moyen très puissant d'utiliser preg_match pour faire ce que vous essayez de faire :

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

Les expressions régulières peuvent sembler déroutantes au début, mais elles peuvent être très puissantes et devenir votre meilleur ami une fois que vous les maîtrisez ! Bonne chance !

1voto

Robert Mauro Points 429

Pourquoi...

C'est probablement trop pour les besoins de la plupart des gens, mais cela répond à un certain nombre de choses que les réponses individuelles ci-dessus ne permettent pas. Parmi les éléments qu'elle aborde, trois d'entre eux étaient nécessaires pour mes besoins. Avec des crochets serrés et en supprimant les commentaires, cela pourrait rester lisible avec seulement 13 lignes de code.

Cela concerne les points suivants :

  • Impact sur les performances de l'utilisation de REGEX par rapport à strrpos/strstr/strripos/stristr.
  • Utilisation de strripos/strrpos lorsque le caractère/chaîne n'est pas trouvé dans la chaîne.
  • Suppression du côté gauche ou droit de la chaîne (première ou dernière occurrence) .
  • Sensibilité du CaSe.
  • Je souhaite avoir la possibilité de retourner la chaîne de caractères d'origine sans la modifier si le caractère ou la chaîne de caractères recherchés ne sont pas trouvés.

Utilisation :

Envoyez la chaîne de caractères originale, recherchez les caractères/chaînes, "R"/"L" pour le début à droite ou à gauche, vrai/faux pour la sensibilité à la casse. Par exemple, la recherche de "ici" ne tient pas compte de la casse, dans la chaîne, le début est à droite.

echo TruncStringAfterString("Now Here Are Some Words Here Now","here","R",false);

Le résultat serait "Now Here Are Some Words". En remplaçant le "R" par un "L", on obtient.. : "Maintenant".

Voici la fonction :

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
    }           

}

-1voto

Faisal Points 2586

Utilisez le strstr fonction.

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

echo $result ;

Le troisième paramètre true indique à la fonction de retourner tout ce qui se trouve avant la première occurrence du deuxième paramètre.

-1voto

mohamed ruzaik Points 454

Hé, j'ai pensé que cela pourrait être utile pour quelqu'un qui veut remplacer le Les caractères viennent après le "Par". , par exemple dans le texte qu'il a donné a par à la 20ème de sa chaîne de caractères, donc si vous voulez ignorer la par vous devriez ajouter + 2 à la position alors qui ignorera la 20ème position et il remplacera tout après venir le par cela fonctionnera si vous donnez la longueur exacte du texte. que vous allez remplacer.

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

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