web-dev-qa-db-fra.com

Supprimer une portion de chaîne après un certain caractère

Je me demande simplement comment je pourrais tout supprimer après une certaine sous-chaîne en PHP

ex:

Posted On April 6th By Some Dude

Je voudrais l'avoir pour qu'il supprime tout le texte, y compris, et après, la sous chaîne "By"

Merci

112
Belgin Fish
$variable = substr($variable, 0, strpos($variable, "By"));

En clair: Donne-moi la partie de la chaîne qui commence au début et se termine à la position où tu as rencontré le déliminateur pour la première fois.

223

Si vous utilisez PHP 5.3+, regardez l'indicateur $ before_needle de strstr ()

$s = 'Posted On April 6th By Some Dude';
echo strstr($s, 'By', true);
86
VolkerK

Que diriez-vous d'utiliser explode:

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

Avantages:

24
squarecandy

Vous pourriez faire:

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

Une méthode serait:

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

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

Plus généralement, vous feriez bien d'examiner les fonctions d'expression régulières lorsque la sous-chaîne sur laquelle vous divisez peut varier d'une chaîne à l'autre:

 $ variable = preg_replace ('/ By. * /', '', $ variable); 
5
jemfinch

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

Usage: 

<?php
    //returns Apples
    $clean_string= strip_after_string ("Apples, Oranges, Banannas",",");
?>
5
Tim Yobson
$var = "Posted On April 6th By Some Dude";
$new_var = substr($var, 0, strpos($var, " By"));
3
Tim Cooper

preg_replace offre un moyen:

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

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 "
2
Salman A

Vous trouverez ci-dessous la méthode la plus efficace (par exécution) pour tout couper après le premier By dans une chaîne. Si By n'existe pas, la chaîne complète est renvoyé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 souhaitez pas être sensible à la casse, utilisez stripos au lieu de strpos. Si vous pensez que By peut exister plusieurs fois et que vous souhaitez tout supprimer après la dernière occurrence, utilisez strrpos .

La méthode ci-dessous est moins efficace, mais elle prend moins d’espace de code. Cette méthode est également plus flexible et vous permet de faire 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 voulez 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 la casse, ajoutez le modificateur i comme ceci:

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

Pour que tout passe au-delà du dernier By si vous pensez qu'il pourrait y en avoir plus d'un, ajoutez un extra. * Au début, comme ceci:

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

Mais voici aussi un moyen très puissant d’utiliser preg_match pour faire ce que vous essayez peut-être 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!

2
azoundria

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

2
Ming-Tang

Utilisez la fonction strstr .

<?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 tout renvoyer avant la première occurrence du deuxième paramètre.

0
Faisal

Pourquoi...

Ceci est probablement excessif pour les besoins de la plupart des gens, mais, il aborde un certain nombre de choses que chaque personne ne répond pas ci-dessus. Parmi les articles qu’il adresse, trois d’entre eux étaient nécessaires à mes besoins. Si les commentaires sont crochus et serrés, cela pourrait rester lisible avec seulement 13 lignes de code.

Cela concerne:

  • Impact sur les performances de l’utilisation de REGEX vs strrpos/strstr/strripos/stristr.
  • Utilisation de strripos/strrpos lorsque caractère/chaîne ne figure pas dans la chaîne.
  • Suppression du côté gauche ou droit de la chaîne (première ou dernière occurrence).
  • Sensibilité au CaSe.
  • Vouloir avoir la possibilité de retourner la chaîne d'origine inchangée si le caractère de recherche/chaîne est introuvable.

Utilisation:

Envoie la chaîne originale, recherche caractère/chaîne, "R"/"L" pour commencer du côté droit ou gauche, vrai/faux pour la sensibilité à la casse. Par exemple, recherchez "ici" sans tenir compte de la casse, dans la chaîne, commencez du côté droit.

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

La sortie serait "Maintenant, voici quelques mots". Changer le "R" en "L" donnerait: "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
    }           

}
0
Robert Mauro