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 "Par"
Merci
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 "Par"
Merci
Réponses:
$variable = substr($variable, 0, strpos($variable, "By"));
En clair: donnez-moi la partie de la chaîne commençant au début et se terminant à la position où vous rencontrez pour la première fois le déliminateur.
Si vous utilisez PHP 5.3+, jetez un œil à l'indicateur $ before_needle de strstr ()
$s = 'Posted On April 6th By Some Dude';
echo strstr($s, 'By', true);
FALSEsi une partie de la chaîne n'est pas trouvée. La solution pourrait donc être:echo strstr($s, 'By', true) ?: $s;
explode(' By', $s)[0]IMHO de squarecandy
Que diriez-vous d'utiliser explode:
$input = 'Posted On April 6th By Some Dude';
$result = explode(' By',$input);
return $result[0];
Avantages:
$result[1]reviendrait Some Dudedans cet exemple)Vous pourriez faire:
$posted = preg_replace('/ By.*/', '', $posted);
echo $posted;
Une méthode serait:
$str = 'Posted On April 6th By Some Dude';
echo strtok($str, 'By'); // Posted On April 6th
By, mais par n'importe quel caractère du 2ème paramètre. Cela signifie qu'il sera divisé par Bou par y. Techniquement, il n'y a pas tout avant un By.
strtok('a:b', ':')retournera amais strtok(':b', ':')retournera b, pas une chaîne vide comme on s'y attend.
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",",");
?>
La réponse d'Austin fonctionne pour votre exemple.
Plus généralement, vous feriez bien d'examiner les fonctions des expressions régulières lorsque la sous-chaîne sur laquelle vous divisez peut différer entre les chaînes:
$ variable = preg_replace ('/ By. * /', '', $ variable);
$var = "Posted On April 6th By Some Dude";
$new_var = substr($var, 0, strpos($var, " By"));
preg_replace offre un moyen:
$newText = preg_replace('/\bBy.*$/', '', $text);
En utilisant une expression régulière: $string = preg_replace('/\s+By.*$/', '', $string)
Vous trouverez ci-dessous la méthode la plus efficace (au moment de l'exécution) pour tout couper après le premier By d'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 voulez pas être sensible à la casse, utilisez des stripos au lieu de strpos. Si vous pensez que By peut exister plus d'une fois et que vous voulez tout couper après la dernière occurrence, utilisez strrpos .
Vous trouverez ci-dessous une méthode moins efficace mais qui 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 souhaitez 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"
Si vous ne respectez pas la casse, ajoutez le modificateur i comme ceci:
$sResult = preg_replace("' ".$pControl.".*'si", '', $sInputString);
Pour tout faire passer le 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 également 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 vraiment puissantes et devenir votre meilleur ami une fois que vous les maîtrisez! Bonne chance!
Pourquoi...
C'est probablement exagéré pour les besoins de la plupart des gens, mais cela répond à un certain nombre de choses que chaque réponse individuelle ci-dessus ne fait pas. Parmi les articles qu'il traite, trois d'entre eux étaient nécessaires pour mes besoins. Avec des crochets serrés et la suppression des commentaires, cela pourrait rester lisible à seulement 13 lignes de code.
Cela répond aux questions suivantes:
Usage:
Envoyer la chaîne d'origine, rechercher char / string, "R" / "L" pour commencer à droite ou à gauche, true / false pour la sensibilité à la casse. Par exemple, recherchez «ici» insensible à la casse, dans la chaîne, commencez par le 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" produirait: "Now".
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
}
}
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 trueindique à la fonction de tout renvoyer avant la première occurrence du deuxième paramètre.
strtok($str, 'By')semble plus simple