Php 仅在字符串末尾替换

Php 仅在字符串末尾替换,php,string,replace,Php,String,Replace,echo$string可以给出任何文本 如何删除单词“blank”,仅当它是$string的最后一个单词时 因此,如果我们有一个像“Steve Blank在这里”这样的句子,没有什么不应该被删除,否则如果这个句子是“他的名字是Granblank”,那么“Blank”单词应该被删除。你可以使用正则表达式轻松地完成。\b确保仅当它是一个单独的单词时才将其删除 $str = preg_replace('/\bblank$/', '', $str); 请尝试以下代码: $str = trim($str

echo$string
可以给出任何文本

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


因此,如果我们有一个像“Steve Blank在这里”这样的句子,没有什么不应该被删除,否则如果这个句子是“他的名字是Granblank”,那么
“Blank”
单词应该被删除。

你可以使用正则表达式轻松地完成。
\b
确保仅当它是一个单独的单词时才将其删除

$str = preg_replace('/\bblank$/', '', $str);
请尝试以下代码:

$str = trim($str);
$strlength = strlen($str);

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

除非不需要,否则不要使用
preg\u match
。当匹配简单时,PHP本身建议使用字符串函数而不是正则表达式函数。从h手册页上看。

ThiefMaster非常正确。一种不涉及行尾字符
$
regex的技术是使用

^如果要删除字符串的最后一个字符,则需要执行此操作。如果要删除最后一个单词:

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

作为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

我觉得有点太复杂了。不复杂,然后做正则表达式和单独的函数。你可以通过分步做来简化。我们只是在使用内置的软件。是的,但是考虑这个解决方案与可接受的答案相比的可维护性…这个代码将替换所有的“空白”,只要它是最后一个出现在字符串中就应该替换。这就是
$
的作用。@Steve你试过这个代码吗?它适用于您建议的用例。$仅在字符串末尾为空时表示匹配。尽管在您的特定用例中,正则表达式应该是/blank$/,因为您不关心单词边界。不会在字符串末尾的“Granblank”之类的单词中替换“blank”。他自己的定义是“仅当它是$string的最后一个单词时”而不是“仅当它是字符串的最后一个字符时”。已编辑。如果是这样的话,
rtrim
就更吸引人了。这就是你要求的,你说的是如果字符串的最后一个字是blank,而不是“如果字符串以‘blank’结尾”。但是,如果是“Gran.blank”,它就会失败。@EboMike:没错,我已经编辑了以反映问题的双重性。trim/ltrim/rtrim不是这样工作的。。。第二个参数获取要删除的字符列表。所以
rtrim('Hello bbbbbbbb','blank')='Hello'
。此外,它不接受正则表达式转义序列。
/**
 * 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