我需要删除字符串的子字符串,但仅当它在字符串的结尾时才需要。
例如,删除以下字符串末尾的“字符串”:
"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,但是如何?
Answers:
您会注意到该$
字符的使用,它表示字符串的结尾:
$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);
preg_*
功能族知道编码吗?什么[^[:alnum:]]
字符类?
如果子字符串包含特殊字符,则使用regexp可能会失败。
以下将适用于任何字符串:
$substring = 'string';
$str = "this string is a test string";
if (substr($str,-strlen($substring))===$substring) $str = substr($str, 0, strlen($str)-strlen($substring));
$str = substr($str, 0, -strlen($substring));
推荐为正则表达式的好选择。我为我的问题想出了相同的答案。preg_*
如果
我为字符串的左右修剪编写了这两个函数:
/**
* @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;
}
我想你可以使用正则表达式,这将匹配string
,然后,字符串的结束,再加上preg_replace()
功能。
这样的事情应该可以正常工作:
$str = "this is a test string";
$new_str = preg_replace('/string$/', '', $str);
注意事项:
string
火柴...好... string
$
表示字符串的结尾有关更多信息,您可以阅读PHP手册的“模式语法”部分。
您可以使用rtrim()。
php > echo rtrim('this is a test string', 'string');
this is a test
这仅在某些情况下有效,因为'string'
只是字符掩码和字符顺序将不被遵守。
trim()
函数将删除第二个参数中提供的任何字符组合。rtrim('teststring', 'string')
返回字符串“ te”,而不是“ test”,因为“ test”末尾的“ st”由属于to的第二个参数的字符集中的字符组成rtrim()
。
echo str_replace( '#', 'string', rtrim( str_replace( 'string', '#', 'this is a test string' ), '#' ) );
以仅获取特定的字符串而不是组合。当然:您的字符串不必包含字符“#”即可工作,而且绝对不是一种优雅的解决方案。
s($str)->replaceSuffix('string')
有用的信息。