删除一部分string,但只有当它在string的末尾
我需要删除一个string的子string,但只有当它在string的结束。
例如,删除以下string末尾的“string”:
"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,但如何?
你会注意到$
字符的使用,它表示string的结尾:
$new_str = preg_replace('/string$/', '', $str);
如果string是用户提供的variables,则首先通过preg_quote
运行它是个好主意:
$remove = $_GET['remove']; // or whatever the case may be $new_str = preg_replace('/'. preg_quote($remove, '/') . '$/', '', $str);
如果子string有特殊字符,则使用正则expression式可能会失败。
以下将使用任何string:
$substring = 'string'; $str = "this string is a test string"; if (substr($str,-strlen($substring))===$substring) $str = substr($str, 0, strlen($str)-strlen($substring));
我想你可以使用正则expression式 ,这将匹配string
,然后, string的结尾 ,再加上preg_replace()
函数。
像这样的东西应该工作得很好:
$str = "this is a test string"; $new_str = preg_replace('/string$/', '', $str);
备注:
-
string
匹配…呃…string
-
$
表示string的结尾
有关更多信息,可以阅读PHP手册的“ 模式语法”部分。
我为string的左右修剪写了这两个函数:
/** * @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; }
你可以使用rtrim() 。
php > echo rtrim('this is a test string', 'string'); this is a test