Rimuovi una parte di una string, ma solo quando si trova alla fine della string

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
  • e $ 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

http://tr.php.net/preg_replace