Devo rimuovere una sottostring di una string, ma solo quando è alla FINE della string.
ad esempio, rimuovere "string" alla fine delle seguenti stringhe:
"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"
Qualche idea ? Probabilmente una specie di preg_replace, ma come ??
Noterai l'uso del carattere $
, che indica la fine di una string:
$new_str = preg_replace('/string$/', '', $str);
Se la string è una variabile fornita dall'utente, è una buona idea eseguirla prima con preg_quote
:
$remove = $_GET['remove']; // or whatever the case may be $new_str = preg_replace('/'. preg_quote($remove, '/') . '$/', '', $str);
L'uso di regexp può fallire se la sottostring ha caratteri speciali.
Quanto segue functionrà con qualsiasi string:
$substring = 'string'; $str = "this string is a test string"; if (substr($str,-strlen($substring))===$substring) $str = substr($str, 0, strlen($str)-strlen($substring));
Suppongo che potresti usare un'espressione regolare , che corrisponde alla string
e, quindi, alla fine della string , accoppiata alla function preg_replace()
.
Qualcosa di simile dovrebbe funzionare bene:
$str = "this is a test string"; $new_str = preg_replace('/string$/', '', $str);
Gli appunti :
string
corrispondenze … bene … string
$
significa fine della string Per maggiori informazioni, puoi leggere la sezione Sintassi del pattern del manuale PHP.
Ho scritto queste due funzioni per il taglio sinistro e destro di una string:
/** * @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; }
Puoi usare rtrim () .
php > echo rtrim('this is a test string', 'string'); this is a test
Questo functionrà solo in alcuni casi, poiché 'string'
è solo una maschera di caratteri e l'ordine di caricamento non verrà rispettato.
preg_replace e questo model: / string \ z / i
\ z significa fine della string