Удалите часть строки, но только когда она находится в конце строки

Мне нужно удалить подстроку строки, но только когда она находится в конце строки.

например, удалив «string» в конце следующих строк:

"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" 

Есть идеи ? Наверное, какой-то preg_replace, но как?

Solutions Collecting From Web of "Удалите часть строки, но только когда она находится в конце строки"

Вы заметите использование символа $ , который обозначает конец строки:

 $new_str = preg_replace('/string$/', '', $str); 

Если строка является переменной, предоставленной пользователем, preg_quote сначала запустить ее с помощью preg_quote :

 $remove = $_GET['remove']; // or whatever the case may be $new_str = preg_replace('/'. preg_quote($remove, '/') . '$/', '', $str); 

Использование regexp может завершиться неудачно, если подстрока имеет специальные символы.

Следующее будет работать с любыми строками:

 $substring = 'string'; $str = "this string is a test string"; if (substr($str,-strlen($substring))===$substring) $str = substr($str, 0, strlen($str)-strlen($substring)); 

Я предполагаю, что вы можете использовать регулярное выражение , которое будет соответствовать string а затем конец строки в сочетании с preg_replace() .

Что-то вроде этого должно работать нормально:

 $str = "this is a test string"; $new_str = preg_replace('/string$/', '', $str); 

Заметки :

  • string matches … well … string
  • и $ означает конец строки

Для получения дополнительной информации вы можете прочитать раздел « Синтаксис шаблонов » руководства PHP.

Я написал эти две функции для левой и правой отделки строки:

 /** * @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; } 

Вы можете использовать rtrim () .

 php > echo rtrim('this is a test string', 'string'); this is a test 

Это будет работать только в некоторых случаях, поскольку 'string' – это просто маска символов, а порядок символов не будет соблюден.

preg_replace и этот шаблон: / string \ z / i

\ z означает конец строки

http://tr.php.net/preg_replace