删除字符串的一部分,但仅当它位于字符串的末尾时

时间:2011-04-06 21:43:38

标签: php string replace preg-replace

我需要删除字符串的子字符串,但只有当它位于字符串的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,但是怎么样?

8 个答案:

答案 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)

preg_replace和这种模式:/ string \ z / i

\ z表示字符串

的结尾

http://tr.php.net/preg_replace

答案 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命令不会被尊重。