如何在PHP中将最后一个"s"替换为""

12

我需要知道如何用 PHP 将字符串中的最后一个 "s" 替换为 ""。

假设有一个字符串 testers,输出应该是 tester。 它只应该替换最后一个 "s",而不是字符串中的所有 "s"。 要在 PHP 中实现这个功能,可以使用以下代码:

```php $string = 'testers'; $string = preg_replace('/s([^s]*)$/', '$1', $string); ```

这将匹配字符串中的最后一个 "s",并用空字符串替换它。


9
像“this”这样的单词会被翻译成“这个”,而不是“thi”。 - Anthony Forloney
是的,没错,这就是它。 - streetparade
1
我很好奇地问,为什么?另外,字符串“your's”的预期输出是什么?您是否也希望将其转换? - Anthony Forloney
2
字符串的最后一个 s,可以出现在字符串的任何位置,或者只有当它在字符串的真正结尾时才出现。那么 "Test string" 应该变成 "Test tring" 吗? - Veger
你的最终目标是删除所有 S,还是只删除复数词中的 s?(以前从来没有需要把 s 变成复数...哈哈) - Derek Adair
6个回答

24
if (substr($str, -1) == 's')
{
    $str = substr($str, 0, -1);
}

2
仅在s是最后一个字符时删除它。 - Felix Kling
我该如何删除“String with s not in last position”中的最后一个s - Felix Kling
@Felix:你可以使用任何解决方案来删除,但是streetparade只需要在字符串实际上是最后一个字符时才删除“s”。 - zerkms
@zerkms:他在哪里说了这个? - Felix Kling
你的回答非常有用,因为它使用了优雅的正则表达式。很抱歉给你投了负一票,现在已经改回来了 :-( - zerkms
显示剩余3条评论

17

更新:好的,也可以使用strrpossubstr_replace函数来实现:

$str = "A sentence with 'Testers' in it";
echo substr_replace($str,'', strrpos($str, 's'), 1);
// Ouputs: A sentence with 'Tester' in it

strrpos函数返回字符串最后一次出现的位置的索引,而substr_replace函数则从指定位置开始替换一个字符串。

(正如我刚刚注意到的,这与 Gordon 提议的方法相同。)


到目前为止,所有答案都会移除单词的最后一个字符。然而,如果你真的想替换字符的最后一次出现,可以使用preg_replace负向前瞻来实现:

$s = "A sentence with 'Testers' in it";
echo preg_replace("%s(?!.*s.*)%", "", $string );

// Ouputs: A sentence with 'Tester' in it

2
老兄,他只需要替换字符串中的一个字符。 - zerkms
哈哈,给你们两个点赞。回答太棒了。@Felix,如果我问你在C++中如何添加int,你会先说“首先创建一个布尔变量'carry'来存储每个位相加后的进位”吗? :P - Cam
1
@zerkms:至少这正是他所要求的。 - Felix Kling
@incrediman:当然不是啦 ;) 但我认为最好从一个“不太优化”的解决方案开始,以产生所需的结果,并从那里继续,而不是使用一个快速的解决方案,在所有情况下都无法正常工作。 - Felix Kling
@Felix:是的 - 不管怎样,这是一个有趣的正则表达式 :) - Cam
如果你决定用正则表达式解决问题,你会遇到第二个问题(找不到原始数据);-) - zerkms

5
您的问题有些不清楚,您是要从字符串末尾删除字符“s”还是删除字符串中最后一次出现的字符“s”。这是有区别的。如果您想要第一种情况,请使用zerkms提供的解决方案。
这个函数从字符串中删除字符“$char”的最后一次出现,无论它在字符串中的位置如何,或者当$string中不存在$char时返回整个字符串。
function removeLastOccurenceOfChar($char, $string)
{
    if( ($pos = strrpos($string, $char)) !== FALSE) {
        return substr_replace($string, '', $pos, 1);
    }
    return $string;
}
echo removeLastOccurenceOfChar('s', "the world's greatest");
// gives "the world's greatet"

如果您的意图是对单词进行变形,例如将其变为单数/复数,则可以查看这个简单的变形器类以了解应该采取哪种方法。 点击此处

不错的示例,但并未演示什么;-) 函数doanything($char, $string) { return $string; } 将以相同方式工作,但速度更快。 - zerkms
啊,我错过了“greatest”中消失的那个“s”。我需要戴眼镜。无论如何 - 这只会在“s”位于最后位置时才替换字符串中的“s”。 - zerkms
@zerkms,我还是不明白你的意思。该函数将替换字符串中最后一个$char的出现位置,无论它在字符串中的哪个位置。原帖中并没有明确指出作者是想从“结束”还是“最后一次出现”的地方删除“s”,这是有区别的。 - Gordon

5
$result = rtrim($str, 's');
$result = str_pad($result, strlen($str) - 1, 's');

请查看rtrim()函数的文档

4
相比于zerkms的解决方案,这个方案过度杀伤力极强 :) - David Snabel-Caunt

3
$str = preg_replace("/s$/i","",rtrim($str));

0

最简单的解决方案是使用rtrim()

这正是该函数旨在使用的内容: 从字符串末尾删除空格(或其他字符)。

没有比这更简单的了,我不确定为什么会有人建议从正则表达式转向“if/else”块。

这是您的代码:

$string = "Testers";
$stripped = rtrim( $string, 's' );

输出将是: 测试人员


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接