好吧,我拿了@ edson-medina的解決方案,修正了一個bug並添加了一些單元測試。以下是我們用來給MB對手修剪,rtrim和ltrim的3個函數。
////////////////////////////////////////////////////////////////////////////////////
//Add some multibyte core functions not in PHP
////////////////////////////////////////////////////////////////////////////////////
function mb_trim($string, $charlist = null) {
if (is_null($charlist)) {
return trim($string);
} else {
$charlist = preg_quote($charlist, '/');
return preg_replace("/(^[$charlist]+)|([$charlist]+$)/us", '', $string);
}
}
function mb_rtrim($string, $charlist = null) {
if (is_null($charlist)) {
return rtrim($string);
} else {
$charlist = preg_quote($charlist, '/');
return preg_replace("/([$charlist]+$)/us", '', $string);
}
}
function mb_ltrim($string, $charlist = null) {
if (is_null($charlist)) {
return ltrim($string);
} else {
$charlist = preg_quote($charlist, '/');
return preg_replace("/(^[$charlist]+)/us", '', $string);
}
}
////////////////////////////////////////////////////////////////////////////////////
這裏的單元測試中,我寫了有興趣的人:
public function test_trim() {
$this->assertEquals(trim(' foo '), mb_trim(' foo '));
$this->assertEquals(trim(' foo ', ' o'), mb_trim(' foo ', ' o'));
$this->assertEquals('foo', mb_trim(' Åfooホ ', ' Åホ'));
}
public function test_rtrim() {
$this->assertEquals(rtrim(' foo '), mb_rtrim(' foo '));
$this->assertEquals(rtrim(' foo ', ' o'), mb_rtrim(' foo ', ' o'));
$this->assertEquals('foo', mb_rtrim('fooホ ', ' ホ'));
}
public function test_ltrim() {
$this->assertEquals(ltrim(' foo '), mb_ltrim(' foo '));
$this->assertEquals(ltrim(' foo ', ' o'), mb_ltrim(' foo ', ' o'));
$this->assertEquals('foo', mb_ltrim(' Åfoo', ' Å'));
}
看起來像一個無限遞歸給我... – knittl 2012-04-08 21:27:35
裝飾()將刪除像字符「\ t,\ r,\ n, \ 0,\ x0B「和\ s修飾符如」\ t,\ r,\ n,\ v,\ f「,所以不是您想要的。要從字符串中刪除一些特殊字符,您可以隨時使用帶第二個參數的trim($ str,$ charlist)。你能寫一些你想刪除的字符的例子嗎? – Naki 2012-04-08 22:11:32
你想刪除哪些字符修剪()不會刪除? – Niko 2012-04-08 22:15:58