Je dois supprimer une sous-chaîne d'une chaîne, mais uniquement lorsqu'elle se trouve à la fin de la chaîne.
par exemple, en supprimant "chaîne" à la fin des chaînes suivantes:
"this is a test string" -> "this is a test "
"this string is a test string" - > "this string is a test "
"this string is a test" -> "this string is a test"
Des idées ? Probablement une sorte de preg_replace, mais comment ??
Vous noterez l'utilisation du caractère $
, qui désigne la fin d'une chaîne:
$new_str = preg_replace('/string$/', '', $str);
Si la chaîne est une variable fournie par l'utilisateur, il est conseillé de l'exécuter via preg_quote
first:
$remove = $_GET['remove']; // or whatever the case may be
$new_str = preg_replace('/'. preg_quote($remove, '/') . '$/', '', $str);
L'utilisation de regexp peut échouer si la sous-chaîne contient des caractères spéciaux.
Ce qui suit fonctionnera avec toutes les chaînes:
$substring = 'string';
$str = "this string is a test string";
if (substr($str,-strlen($substring))===$substring) $str = substr($str, 0, strlen($str)-strlen($substring));
J'ai écrit ces deux fonctions pour la coupe droite et gauche d'une chaîne:
/**
* @param string $str Original string
* @param string $needle String to trim from the end of $str
* @param bool|true $caseSensitive Perform case sensitive matching, defaults to true
* @return string Trimmed string
*/
function rightTrim($str, $needle, $caseSensitive = true)
{
$strPosFunction = $caseSensitive ? "strpos" : "stripos";
if ($strPosFunction($str, $needle, strlen($str) - strlen($needle)) !== false) {
$str = substr($str, 0, -strlen($needle));
}
return $str;
}
/**
* @param string $str Original string
* @param string $needle String to trim from the beginning of $str
* @param bool|true $caseSensitive Perform case sensitive matching, defaults to true
* @return string Trimmed string
*/
function leftTrim($str, $needle, $caseSensitive = true)
{
$strPosFunction = $caseSensitive ? "strpos" : "stripos";
if ($strPosFunction($str, $needle) === 0) {
$str = substr($str, strlen($needle));
}
return $str;
}
Je suppose que vous pourriez utiliser une expression régulière , qui correspondrait à string
, puis à fin de chaîne, couplée à la fonction preg_replace()
.
Quelque chose comme ça devrait marcher:
$str = "this is a test string";
$new_str = preg_replace('/string$/', '', $str);
Remarques :
string
correspond ... eh bien ... string
$
signifie fin de chaîne _Pour plus d'informations, vous pouvez lire la section Pattern Syntax du manuel PHP.
preg_replace et ce modèle:/string\z/i
\ z signifie la fin de la chaîne
SI les performances ne vous dérangent pas ET que la partie de la chaîne ne peut être placée qu’à la fin de la chaîne, ALORS vous pouvez le faire:
$string = "this is a test string";
$part = "string";
$string = implode( $part, array_slice( explode( $part, $string ), 0, -1 ) );
echo $string;
// OUTPUT: "this is a test "
Vous pouvez utiliser rtrim () .
php > echo rtrim('this is a test string', 'string');
this is a test
Cela ne fonctionnera que dans certains cas, car 'string'
est juste un masque de caractères et l'ordre des caractères ne sera pas respecté.