Мне нужно удалить подстроку строки, но только когда она находится в конце строки.
например, удалив «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, но как?
Вы заметите использование символа $
, который обозначает конец строки:
$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 означает конец строки