【问题标题】:Replace only at the end of the string仅在字符串末尾替换
【发布时间】:2012-02-03 19:34:04
【问题描述】:

echo $string 可以给出任何文本。

如何删除单词"blank"仅当它是$string 的最后一个单词

所以,如果我们有一个像 "Steve Blank is here" 这样的句子 - 不应该删除任何内容,否则如果句子是 "his name is Granblank",那么应该删除 "Blank" 单词。

【问题讨论】:

    标签: php string replace


    【解决方案1】:

    您可以使用正则表达式轻松完成。 \b 确保只有当它是一个单独的词时才会被删除。

    $str = preg_replace('/\bblank$/', '', $str);
    

    【讨论】:

    • 这段代码将在所有地方替换“空白”,只要它是字符串中的最后一次出现就应该替换。
    • 错了。这就是$ 的用途。
    • @Steve 你试过这段代码了吗?它适用于您建议的用例。 $ 仅当字符串末尾有空格时才表示匹配。尽管在您的特定用例中,正则表达式将是 /blank$/,因为您不关心单词边界。
    【解决方案2】:

    试试下面的代码:

    $str = trim($str);
    $strlength = strlen($str);
    
    if (strcasecmp(substr($str, ($strlength-5), $strlength), 'blank') == 0)
        echo $str = substr($str, 0, ($strlength-5))
    

    除非不需要,否则不要使用preg_match。当匹配很简单时,PHP 本身建议使用字符串函数而不是正则表达式函数。来自preg_match 手册页。

    【讨论】:

    • 在我看来有点过于复杂了。
    • 做正则表达式和单独的函数并不复杂。您可以通过逐步进行操作来简化。我们只是使用内置函数。
    • 是的,但是与接受的答案相比,请考虑此解决方案的可维护性...
    【解决方案3】:

    ThiefMaster 说的很对。不涉及行尾$ 正则表达式字符的技术是使用rtrim

    $trimmed = rtrim($str, "blank");
    var_dump($trimmed);
    

    ^ 如果你想删除字符串的最后一个字符。如果要删除最后一个单词:

    $trimmed = rtrim($str, "\sblank");
    var_dump($trimmed);
    

    【讨论】:

    • 不会替换字符串末尾的“Granblank”等单词中的“blank”
    • 嗯,他自己的定义说“仅当它是 $string 的最后一个单词时”,而不是“仅当它是字符串的最后一个字符时”。已编辑。如果是这样,那么rtrim 就更有吸引力了。
    • 这就是你所要求的,你说如果空白是字符串的最后一个单词,而不是“如果字符串以'空白'结尾。”但是,如果它是“Gran.blank”,它将失败。
    • @EboMike:确切地说,我已经编辑以反映问题的二元性。
    • 不是 trim/ltrim/rtrim 的工作原理...第二个参数采用要删除的字符列表。所以rtrim('Hello bbbbbb', 'blank') = 'Hello '。此外,它不接受正则表达式转义序列。
    【解决方案4】:

    作为 Teez 答案的变体:

    /**
     * A slightly more readable, non-regex solution.
     */
    function remove_if_trailing($haystack, $needle)
    {
        // The length of the needle as a negative number is where it would appear in the haystack
        $needle_position = strlen($needle) * -1;  
    
        // If the last N letters match $needle
        if (substr($haystack, $needle_position) == $needle) {
             // Then remove the last N letters from the string
             $haystack = substr($haystack, 0, $needle_position);
        }
    
        return $haystack;
    }
    
    echo remove_if_trailing("Steve Blank is here", 'blank');   // OUTPUTS: Steve blank is here
    echo remove_if_trailing("his name is Granblank", 'blank');  // OUTPUTS: his name is Gran
    

    【讨论】:

      猜你喜欢
      • 2017-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-20
      • 2011-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多