我需要删除字符串的子字符串,但只有当它位于字符串的END处时才会删除。
例如,删除以下字符串末尾的“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,但是怎么样?
答案 0 :(得分:110)
你会注意到使用$
字符,它表示字符串的结尾:
$new_str = preg_replace('/string$/', '', $str);
如果字符串是用户提供的变量,最好先通过preg_quote
运行它:
$remove = $_GET['remove']; // or whatever the case may be
$new_str = preg_replace('/'. preg_quote($remove, '/') . '$/', '', $str);
答案 1 :(得分:22)
如果子字符串具有特殊字符,则使用regexp可能会失败。
以下内容适用于任何字符串:
$substring = 'string';
$str = "this string is a test string";
if (substr($str,-strlen($substring))===$substring) $str = substr($str, 0, strlen($str)-strlen($substring));
答案 2 :(得分:9)
我为字符串的左右修剪写了这两个函数:
/**
* @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;
}
答案 3 :(得分:7)
我想你可以使用regular expression,它匹配string
,然后字符串结尾,再加上preg_replace()
函数。
像这样的东西应该可以正常工作:
$str = "this is a test string";
$new_str = preg_replace('/string$/', '', $str);
注意:
string
匹配......嗯... string
$
表示字符串结尾 有关更多信息,您可以阅读PHP手册的Pattern Syntax部分。
答案 4 :(得分:2)
答案 5 :(得分:0)
如果您不介意性能,并且字符串的一部分只能放在字符串的末尾,那么您可以这样做:
$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 "
答案 6 :(得分:0)
@Skrol29 的答案是最好的,但这里是函数形式并使用三元运算符:
if (!function_exists('str_ends_with')) {
function str_ends_with($haystack, $suffix) {
$length = strlen( $suffix );
if( !$length ) {
return true;
}
return substr( $haystack, -$length ) === $suffix;
}
}
if (!function_exists('remove_suffix')) {
function remove_suffix ($string, $suffix) {
return str_ends_with($string, $suffix) ? substr($string, 0, strlen($string) - strlen($suffix)) : $string;
}
}
答案 7 :(得分:-2)
您可以使用rtrim()。
php > echo rtrim('this is a test string', 'string');
this is a test
这仅在某些情况下有效,因为'string'
只是一个字符掩码而且char命令不会被尊重。