【问题标题】:Replace last word in string替换字符串中的最后一个单词
【发布时间】:2011-04-11 21:04:24
【问题描述】:
$variable = 'put returns between paragraphs';

这个变量的值每次改变。

如何在最后一个单词前添加一些文字?


比如,如果我们想添加'and',结果应该是(对于这个例子):

$variable = 'put returns between and paragraphs';

【问题讨论】:

    标签: php string replace


    【解决方案1】:
    1) reverse your string
    2) find the first whitespace in the string.
    3) chop off the remainder of the string.
    4) reverse that, append your text
    5) reverse and add back on the first portion of the string from step 3, including extra whitespace as needed.
    

    【讨论】:

    • 当然没必要,但很简单,而且这个简单的问题显然需要一个简单易懂的通俗英语(不是代码)的答案,来走一遍如何解决问题的逻辑过程。
    • 如果你没有strrpos,这个算法似乎很合理。
    【解决方案2】:
    $addition = 'and';
    $variable = 'put returns between paragraphs';
    $new_variable = preg_replace('/ ([^ ]+)$/', ' ' . $addition . ' $1', $variable);
    

    【讨论】:

    • 考虑将模式中的* 替换为+
    • @jensgram 感谢您的关注。
    【解决方案3】:

    你可以使用preg_replace():

    $add = 'and';
    $variable = 'put returns between paragraphs';    
    echo preg_replace("~\W\w+\s*$~", ' ' . $add . '\\0', $variable);
    

    打印:

    put returns between and paragraphs
    

    这将忽略尾随空格,@jensgram 的解决方案不会。 (例如:如果你的字符串是$variable = 'put returns between paragraphs ',它会中断。当然你可以使用trim(),但是当你可以使用正则表达式时,为什么还要浪费更多的内存并调用另一个函数呢?:-)

    【讨论】:

    • 我无法注明出处,但我曾经听过这句很棒的名言“我遇到了一个问题,决定使用正则表达式。现在我有两个问题”
    • 如何在您的解决方案中添加一些 html 而不是 'and'?
    • @Zak 如果你了解正则表达式,并且知道它可以做什么和不能做什么,这不是问题。
    【解决方案4】:

    您可以使用 strrpos() 函数找到 last 空格:

    $variable = 'put returns between paragraphs';
    $lastSpace = strrpos($variable, ' '); // 19
    

    然后,取两个substrings(在最后一个空格之前和之后)并环绕“and”:

    $before = substr($variable, 0, $lastSpace); // 'put returns between'
    $after = substr($variable, $lastSpace); // ' paragraphs' (note the leading whitespace)
    $result = $before . ' and' . $after;
    

    编辑
    尽管没有人想弄乱子字符串索引,但这是一个非常 PHP 附带有用函数的基本任务(特别是strrpos()substr())。因此,没有需要来处理数组、反转字符串或正则表达式 - 但你当然可以 :)

    【讨论】:

    • @NullUserException 你说得对可能的尾随空格(trim() 可能是解决方案)。就哪种解决方案“更清洁”而言,这是非常主观的。上面的内容很容易评论(因此也很容易理解),而我自己也觉得正则表达式解决方案很简洁。
    • 我发现我的正则表达式解决方案比这更干净。此外,您可以调整它以使用不同的分隔符,或忽略尾随空格(就像我的一样)。如果您的字符串是'put returns between paragraphs '(带有尾随空格),这将中断
    • @jensgram 是的,我知道你可以把trim() 放在那里。缺点是现在你自己增加了更多的开销和更多的内存使用。
    • @NullUserException 开销?是的,我猜。内存使用情况?我认为在几乎任何“正常”情况下都可以忽略不计。此外,我们现在甚至不知道尾随空格是否是一个可能的问题。
    • @jensgram “就哪种解决方案“更清洁”而言,这是非常主观的”。这就是为什么我说“找到我的正则表达式解决方案更清洁”;-)
    【解决方案5】:

    另一种选择

      <?php
      $v = 'put returns between paragraphs';
      $a = explode(" ", $v);
      $item = "and";
      array_splice($a, -1, 0, $item);
      echo  implode(" ",$a);
      ?>
    

    【讨论】:

      【解决方案6】:

      替换最后一个字母

      <?php
      $txt = "what is c";
      
      $count = strlen($txt);
      $txt[$count -1] = "s";
      
      echo $txt;
      // output: what is s
      

      用 s 代替 c

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-08
        • 1970-01-01
        • 2020-09-01
        • 1970-01-01
        相关资源
        最近更新 更多