note 111147 added to function.str-pad
| From: | qeremy | Date: | Sun, 20 Jan 2013 01:44:46 +0000 |
| Subject: | note 111147 added to function.str-pad | ||
| Groups: | php.notes | ||
| Request: | Send a blank email to php-notes+get-193275@lists.php.net to get a copy of this message | ||
A proper unicode string padder;
<?php
mb_internal_encoding('utf-8'); // @important
function str_pad_unicode($str, $pad_len, $pad_str = ' ', $dir = STR_PAD_RIGHT) {
$str_len = mb_strlen($str);
$pad_str_len = mb_strlen($pad_str);
if (!$str_len && ($dir == STR_PAD_RIGHT || $dir == STR_PAD_LEFT)) {
$str_len = 1; // @debug
}
if (!$pad_len || !$pad_str_len || $pad_len <= $str_len) {
return $str;
}
$result = null;
$repeat = ceil($str_len - $pad_str_len + $pad_len);
if ($dir == STR_PAD_RIGHT) {
$result = $str . str_repeat($pad_str, $repeat);
$result = mb_substr($result, 0, $pad_len);
} else if ($dir == STR_PAD_LEFT) {
$result = str_repeat($pad_str, $repeat) . $str;
$result = mb_substr($result, -$pad_len);
} else if ($dir == STR_PAD_BOTH) {
$length = ($pad_len - $str_len) / 2;
$repeat = ceil($length / $pad_str_len);
$result = mb_substr(str_repeat($pad_str, $repeat), 0, floor($length))
. $str
. mb_substr(str_repeat($pad_str, $repeat), 0, ceil($length));
}
return $result;
}
?>
Test;
<?php
// needs ie. "test.php" file encoded in "utf-8 without bom"
$s = '...';
for ($i = 3; $i <= 1000; $i++) {
$s1 = str_pad($s, $i, 'AO', STR_PAD_BOTH); // can not inculde unicode char!!!
$s2 = str_pad_unicode($s, $i, 'ÃÃ', STR_PAD_BOTH);
$sl1 = strlen($s1);
$sl2 = mb_strlen($s2);
echo "len $sl1: $s1 \n";
echo "len $sl2: $s2 \n";
echo "\n";
if ($sl1 != $sl2) die("Fail!");
}
?>
Output;
len 3: ...
len 3: ...
len 4: ...A
len 4: ...Ã
len 5: A...A
len 5: Ã...Ã
len 6: A...AO
len 6: Ã...ÃÃ
...
----
Server IP: 160.75.25.15
Probable Submitter: 88.253.79.190
----
Manual Page -- http://php.net/manual/en/function.str-pad.php
Edit -- https://master.php.net/note/edit/111147
Del: integrated -- https://master.php.net/note/delete/111147/integrated
Del: useless -- https://master.php.net/note/delete/111147/useless
Del: bad code -- https://master.php.net/note/delete/111147/bad+code
Del: spam -- https://master.php.net/note/delete/111147/spam
Del: non-english -- https://master.php.net/note/delete/111147/non-english
Del: in docs -- https://master.php.net/note/delete/111147/in+docs
Del: other reasons-- https://master.php.net/note/delete/111147
Reject -- https://master.php.net/note/reject/111147
Search -- https://master.php.net/manage/user-notes.php