str_pad

(PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)

str_pad用另一个字符串填充字符串到特定长度

描述

str_pad(
    string $string,
    int $length,
    string $pad_string = " ",
    int $pad_type = STR_PAD_RIGHT
): string

此函数返回 string 字符串,在左侧、右侧或两侧填充到指定的填充长度。如果可选参数 pad_string 未提供,则 string 用空格填充,否则用 pad_string 中的字符填充,直到达到限制。

参数

string

输入字符串。

length

最终填充字符串的所需长度。如果 length 的值小于、等于或等于输入字符串的长度,则不进行填充,并返回 string

pad_string

注意:

如果所需的填充字符数不能被 pad_string 的长度整除,则 pad_string 可能会被截断。

pad_type

可选参数 pad_type 可以是 STR_PAD_RIGHTSTR_PAD_LEFTSTR_PAD_BOTH。如果未指定 pad_type,则假定为 STR_PAD_RIGHT

返回值

返回填充后的字符串。

示例

示例 #1 str_pad() 示例

<?php
$input
= "Alien";
echo
str_pad($input, 10); // 输出 "Alien "
echo str_pad($input, 10, "-=", STR_PAD_LEFT); // 输出 "-=-=-Alien"
echo str_pad($input, 10, "_", STR_PAD_BOTH); // 输出 "__Alien___"
echo str_pad($input, 6, "___"); // 输出 "Alien_"
echo str_pad($input, 3, "*"); // 输出 "Alien"
?>

参见

  • mb_str_pad() - 用另一个多字节字符串填充多字节字符串到特定长度

添加注释

用户贡献的注释 28 个注释

111
Marjune
9 年前
由于默认的 pad_type 为 STR_PAD_RIGHT。使用 STR_PAD_BOTH 时,如果所需的填充字符数不能被整除,则始终优先在右侧填充。

例如

<?php

echo str_pad("input", 10, "pp", STR_PAD_BOTH ); // ppinputppp
echo str_pad("input", 6, "p", STR_PAD_BOTH ); // inputp
echo str_pad("input", 8, "p", STR_PAD_BOTH ); //pinputpp

?>
4
Borszczuk
1 年前
注意,\str_pad() 无法正确处理多字节字符,因为它像 \strlen() 一样假设一个字符等于一个字节。如果你的字符串中有多字节字符,你的结果字符串将比你预期的短

<?php
$a
= 'áč'; // 2 个带重音的字符
$lenA = \mb_strlen($a);
echo
$lenA . PHP_EOL;

$b = \str_pad($a, $lenA + 10, ' ');
$lenB = \mb_strlen($b);
echo
$lenB . PHP_EOL;
?>

将输出

2
10

而不是预期的 12。似乎没有 mb_str_pad() 的等效项,所以你可能最终会手动连接你的字符串并进行填充

<?php
$a
= 'áč'; // 2 个带重音的字符

$b = mb_str_pad($a, $lenA + 10, ' ');
$lenB = \mb_strlen($b);
echo
$lenB . PHP_EOL;

function
mb_str_pad(string $str, int $len, string $pad, int $align = \STR_PAD_RIGHT): string
{
$strLen = \mb_strlen($str);
if (
$strLen >= $len) {
return
$str;
}

$diff = $len - $strLen;
$padding = \mb_substr(\str_repeat($pad, $diff), 0, $diff);

switch (
$align) {
case
\STR_PAD_BOTH:
$diffHalf = (int)($diff/2 + 0.5);
$padding = \str_repeat($pad, $diffHalf);
$result = "{$padding}{$str}{$padding}";
break;
case
\STR_PAD_LEFT:
$result = "{$padding}{$str}";
$result = "{$str}{$padding}";
break;
case
\STR_PAD_RIGHT:
default:
$result = "{$str}{$padding}";
break;
}

return
\mb_substr($result, 0, $len);
}
?>

返回预期长度为 12 个字符的字符串。
1
neo_selen
4 年前
你可以使用 str_pad 来显示一个固定位数的整数,就像这样
0002
0003
...
0100

只需写

<?php
for ($i=0;$i<10000;$i++){
echo
str_pad($i,4,'0',STR_PAD_LEFT)."\n";
}
?>

我设置了 4 位数字(见参数 #2),但你可以根据你的需要设置任何适合的位数。
5
robertwhishaw at gmail dot com
4 年前
在 PHP 中,使用 ++ 和 -- 运算符递增或递减数字很容易,但设置数字的精度可能很困难。str_pad() 可用于将字符串连接到递增数字的开头或结尾,以模拟不同的精度。

很好的例子,我们想将 001 递增到 002、003、004

$numbers = [];

for($i = 1; $i <= 4; $i++){
$numbers[] = str_pad($i, 3, '0', STR_PAD_LEFT);
}

print_r($numbers);

$numbers[0] => '001',
$numbers[1] => '002',
$numbers[2] => '003',
$numbers[3] => '004',

不好的例子,我们想将 001 递增到 002、003、004,但如果我们在 for() 循环中将 $i 设置为 001 以开始,001 将被转换为 1,并且递增将返回:1、2、3、4 等...

$numbers = [];

for($i = 001; $i <= 4; $i++){
$numbers[] = $i;
}

print_r($numbers);

$numbers[0] => 1,
$numbers[1] => 2,
$numbers[2] => 3,
$numbers[3] => 4,
12
qeremy [atta] gmail [dotta] com
11 年前
一个合适的 unicode 字符串填充器;

<?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;
}
?>

测试;
<?php
// 需要 ie. "test.php" 文件以 "utf-8 无 bom" 编码
$s = '...';
for (
$i = 3; $i <= 1000; $i++) {
$s1 = str_pad($s, $i, 'AO', STR_PAD_BOTH); // 不能包含 unicode 字符!!!
$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!");
}
?>

输出;
len 3: ...
len 3: ...

len 4: ...A
len 4: ...Ä

len 5: A...A
len 5: Ä...Ä

len 6: A...AO
len 6: Ä...ÄÖ
...
8
wes at nospamplsexample dot org
9 年前
多字节版本

<?php
function mb_str_pad($str, $pad_len, $pad_str = ' ', $dir = STR_PAD_RIGHT, $encoding = NULL)
{
$encoding = $encoding === NULL ? mb_internal_encoding() : $encoding;
$padBefore = $dir === STR_PAD_BOTH || $dir === STR_PAD_LEFT;
$padAfter = $dir === STR_PAD_BOTH || $dir === STR_PAD_RIGHT;
$pad_len -= mb_strlen($str, $encoding);
$targetLen = $padBefore && $padAfter ? $pad_len / 2 : $pad_len;
$strToRepeatLen = mb_strlen($pad_str, $encoding);
$repeatTimes = ceil($targetLen / $strToRepeatLen);
$repeatedString = str_repeat($pad_str, max(0, $repeatTimes)); // safe if used with valid utf-8 strings
$before = $padBefore ? mb_substr($repeatedString, 0, floor($targetLen), $encoding) : '';
$after = $padAfter ? mb_substr($repeatedString, 0, ceil($targetLen), $encoding) : '';
return
$before . $str . $after;
}
?>
4
bob [at] bobarmadillo [dot] com
21 年前
在许多情况下,如果您想使用类似的东西,最好使用 str_repeat - 它会重复整个字符串。

使用 str_repeat,我编写了一个完整的字符串填充函数,它应该在其他所有方面都与 str_pad 非常相似。

<?php
function full_str_pad($input, $pad_length, $pad_string = '', $pad_type = 0) {
$str = '';
$length = $pad_length - strlen($input);
if (
$length > 0) { // str_repeat 不喜欢负数
if ($pad_type == STR_PAD_RIGHT) { // STR_PAD_RIGHT == 1
$str = $input.str_repeat($pad_string, $length);
} elseif (
$pad_type == STR_PAD_BOTH) { // STR_PAD_BOTH == 2
$str = str_repeat($pad_string, floor($length/2));
$str .= $input;
$str .= str_repeat($pad_string, ceil($length/2));
} else {
// 默认使用 STR_PAD_LEFT == 0
$str = str_repeat($pad_string, $length).$input;
}
} else {
// 如果 $length 为负数或零,则无需执行任何操作
$str = $input;
}
return
$str;
}

$pad_me = "Test String";
echo
'|'.full_str_pad($pad_me, 20, ' ')."|\n";
echo
'|'.full_str_pad($pad_me, 20, ' ', STR_PAD_RIGHT)."|\n";
echo
'|'.full_str_pad($pad_me, 20, ' ', STR_PAD_BOTH)."|\n";
?>
2
Spudley
17 年前
警告:如果您的字符串包含非 ASCII 字符(例如英镑符号),str_pad() 将在计算填充时将其视为两个字符。

因此,例如
<?php
str_pad
($currency_symbol.$showtottopay,12," ",STR_PAD_LEFT);
?>
将生成不同长度的字符串,具体取决于 $currency_symbol 是英镑还是美元。

希望这对某人有所帮助——直到我解决这个问题,它在我的发票中造成了很多列对齐问题。
1
mcinp
9 年前
一个不同的、更强大的 str_pad 多字节版本,只有在 $pad_string 是非多字节字符串的情况下才能正常工作。

function my_mb_str_pad($input, $pad_length, $pad_string=' ', $pad_type=STR_PAD_RIGHT,$encoding='UTF-8'){
$mb_diff=mb_strlen($str, $encoding)-strlen($string);
return str_pad($input,$pad_length+$mb_diff,$pad_string,$pad_type);
}
0
gene at swipesy dot com
12 年前
这是我使用 &nbsp; 进行填充的方式

str_replace(" ", "&nbsp;&nbsp;", str_pad($foo, 10, " ", STR_PAD_LEFT))

使用两个 &nbsp; 标签填充每个字符似乎效果很好,至少对我而言是这样。你的结果可能会有所不同。
1
pestilenc at hotmail dot com
22 年前
对我来说,这个方法有效。
$string = 'help';

# 首先,使用唯一字符执行 str_pad()。
$string = str_pad($string, 10, "*", STR_PAD_BOTH);
#$string = '***help***';

# 其次,使用 '&nbsp;' 执行 str_replace。
$string = str_replace("*", "&nbsp;", $string);
0
Fahad dot Gilani at anu dot edu dot au
21 年前
基本上,你们所有人的方法都是用 HTML 标签(包括 &nbsp;)填充文本的“长”方法。您甚至不必执行 str_replace... 尝试以下代码,它将与任何存在的 HTML 标签一起使用,您不必担心标签字符长度等等。
<?
$text = "This is pretty interesting!";
$pad_string = "&nbsp;";

// 在文本的两侧进行填充
$text = str_pad($text, strlen($text)+(20*strlen($pad_string)), $pad_string, STR_PAD_BOTH);
print $text." Dont you think?";
?>
将生成
This is pretty interesting! Dont you think?

干杯!
Fahad
-1
Anonymous
8 年前
以下是 mcinp 版本的 mb_str_pad 错误修复

<?php
function mb_str_pad($input, $pad_length, $pad_string=' ', $pad_type=STR_PAD_RIGHT,$encoding='UTF-8'){
$mb_diff=mb_strlen($input, $encoding)-strlen($input);
return
str_pad($input,$pad_length-$mb_diff,$pad_string,$pad_type);
}
?>

仍然只在 $pad_string 是非多字节字符串的情况下才能正常工作。
-1
gtwizard
7 年前
sprintf 速度更快

$sTime = microtime(true);
$s = sprintf("%'-1000000s", '-');
$eTime = microtime(true);
echo 'sprintf ran in ' . (($eTime - $sTime) * 1000) . ' milliseconds' . "\n";

$sTime = microtime(true);
$s = str_pad('-', 1000000, '-');
$eTime = microtime(true);
echo 'str_pad ran in ' . (($eTime - $sTime) * 1000) . ' milliseconds' . "\n";

// 结果
sprintf ran in 2.0260810852051 milliseconds
str_pad ran in 26.59797668457 milliseconds
-3
bxi at apparoat dot nl
16 年前
如果您想用某个字符将两个字符串填充在一起,可以使用

<?php
function pad_between_strings($string1, $string2, $length, $char = " ") {
$fill_length = $length - ( strlen($string1) + strlen($string2) );
return
$string1 . str_repeat($char, $fill_length) . $string2;
}
?>
-1
匿名
9 年前
对于简单的填充,您可以使用 sprintf,它更快
参见 https://php.net/sprintf 例子 #5 "指定填充字符"
-2
Kirill Fuchs
7 年前
sprintf() 并不总是更快... 它的可扩展性比 str_pad 好得多,因此在运行填充 10k 个字符的基准测试时,sprintf 会胜出。但是,如果您对更真实的情况进行基准测试,似乎 str_pad 是明显的赢家。

$sTime = microtime(true);
$count = 5;
$s = sprintf("%'\n5s", "\n");
$eTime = microtime(true);
echo 'sprintf ran in ' . (($eTime - $sTime) * 1000) . ' milliseconds' . "\n";

$sTime = microtime(true);
$s = str_pad("\n", 5, "\n");
$eTime = microtime(true);
echo 'str_pad ran in ' . (($eTime - $sTime) * 1000) . ' milliseconds' . "\n";

sprintf 运行时间为 0.015974044799805 毫秒
str_pad 运行时间为 0.0059604644775391 毫秒
-3
christian dot reinecke at web dot de
17 年前
用零填充第一个参数(主要是数字,例如来自 <select> 循环以显示日期或时间)。

<?php
function zerofill($mStretch, $iLength = 2)
{
$sPrintfString = '%0' . (int)$iLength . 's';
return
sprintf($sPrintfString, $mStretch);
}
?>

sprintf() 确实比 str_pad 快。
-7
matrebatre
15 年前
这是一个将数字转换为类似这样的字符串的简单函数

0 => 0000
1 => 0001
20 => 0020
432 => 0432

<?php

function number_pad($number,$n) {
return
str_pad((int) $number,$n,"0",STR_PAD_LEFT);
}

?>

$n 表示您想要多少个字符。
-4
Kari &#34;Haprog&#34; Sderholm
15 年前
以下是一个快速简便的方法来创建一个 mb_str_pad 函数,该函数在您正确设置内部编码时有效。

我不确定此方法在所有可能的情况下都能正常工作,但至少它对我有用,我使用 UTF-8 作为内部编码,并在包含斯堪的纳维亚字符 "åäöÅÄÖ" 的字符串上使用此函数,这些字符在 UTF-8 中是双字节的。

<?php
function mb_str_pad($input, $pad_length, $pad_string=' ', $pad_type=STR_PAD_RIGHT) {
$diff = strlen($input) - mb_strlen($input);
return
str_pad($input, $pad_length+$diff, $pad_string, $pad_type);
}
?>
-3
zubfatal <root at it dot dk>
19 年前
<?php
/**
* str_pad_html - 用另一个字符串将字符串填充到特定长度。
* 在参数中接受 HTML 代码:$strPadString。
*
* @name str_pad_html()
* @author Tim Johannessen <[email protected]>
* @version 1.0.0
* @param string $strInput 要迭代的数组,所有非数值将被跳过。
* @param int $intPadLength 填充长度,必须大于零。
* @param string [$strPadString] 用来填充 $strInput 的字符串(默认:&nbsp;)
* @param int [$intPadType] STR_PAD_LEFT,STR_PAD_RIGHT(默认),STR_PAD_BOTH
* @return string 返回填充后的字符串
**/
function str_pad_html($strInput = "", $intPadLength, $strPadString = "&nbsp;", $intPadType = STR_PAD_RIGHT) {
if (
strlen(trim(strip_tags($strInput))) < intval($intPadLength)) {

switch (
$intPadType) {
// STR_PAD_LEFT
case 0:
$offsetLeft = intval($intPadLength - strlen(trim(strip_tags($strInput))));
$offsetRight = 0;
break;

// STR_PAD_RIGHT
case 1:
$offsetLeft = 0;
$offsetRight = intval($intPadLength - strlen(trim(strip_tags($strInput))));
break;

// STR_PAD_BOTH
case 2:
$offsetLeft = intval(($intPadLength - strlen(trim(strip_tags($strInput)))) / 2);
$offsetRight = round(($intPadLength - strlen(trim(strip_tags($strInput)))) / 2, 0);
break;

// STR_PAD_RIGHT
default:
$offsetLeft = 0;
$offsetRight = intval($intPadLength - strlen(trim(strip_tags($strInput))));
break;
}

$strPadded = str_repeat($strPadString, $offsetLeft) . $strInput . str_repeat($strPadString, $offsetRight);
unset(
$strInput, $offsetLeft, $offsetRight);

return
$strPadded;
}

else {
return
$strInput;
}
}

?>
-5
private dot email at optusnet dot com dot au
19 年前
我编写了这 3 个函数,它们存在于我每个程序中包含的库中。我发现它们很有用,而且语法很简单。

<?php

$str
= "test";

function
str_pad_right ( $string , $padchar , $int ) {
$i = strlen ( $string ) + $int;
$str = str_pad ( $string , $i , $padchar , STR_PAD_RIGHT );
return
$str;
}

function
str_pad_left ( $string , $padchar , $int ) {
$i = strlen ( $string ) + $int;
$str = str_pad ( $string , $i , $padchar , STR_PAD_LEFT );
return
$str;
}

function
str_pad_both ( $string , $padchar , $int ) {
$i = strlen ( $string ) + ( $int * 2 );
$str = str_pad ( $string , $i , $padchar , STR_PAD_BOTH );
return
$str;
}

echo
str_pad_left ( $str , "-" , 3 ); // Produces: ---test
echo str_pad_right ( $str , "-" , 3 ); // Produces: test---
echo str_pad_both ( $str , "-" , 3 ); // Produces: ---test---
?>

希望这能帮助到某人!
-4
mreilly at NOSPAM dot mac dot com
21 年前
当使用字符串作为填充值时,str_pad 会使用所有字符进行填充,并可能留下部分字符串。(例如,如果填充值为 'ABC',并且需要 5 个字符进行填充,它将输出 'ABCAB'。) 当你想要使用不间断空格进行填充时,这会成为一个问题,因为不间断空格的代码长 6 个字符。

可以通过先使用一个不会出现在字符串中的单个字符(例如 *)对字符串进行填充,然后使用 str_replace 将 * 替换为 &nbsp; 来解决这个问题。
-1
NOSPAM dot php at my dot jrklein dot com
4 年前
当使用分组密码和使用 openssl_encrypt() 等手动填充时,str_pad() 可以提供足够的“零填充”。

下面的例子将用两个 \x00 字符填充 6 个字符的文本“Secret”,并返回 8 个字符的数据。根据需要替换你的明文和分组大小。

<?php
$text
= "Secret";
$block_size = 8;
$length = ceil(strlen($text) / $block_size) * $block_size;
$data = str_pad($text, $length, "\x00");
-6
Silvio Ginter (silvio dot ginter at gmx dot de)
18 年前
你好,

对于任何需要它的人,我编写了这个 str_pad 的扩展。有关详细信息,请查看注释。

<?php

$string
= 'this is a test';
$oldLen = strlen($string);
$direction = STR_PAD_BOTH;
echo
$string.'<br>';
echo
str_const_len($string, 101, '#', $direction).'<br>';
echo
$string.'<br>';
echo
str_const_len($string, $oldLen, '#', $direction).'<br>';
echo
$string.'<br><br>'."\n";



/* 此函数是 str_pad 的扩展,它操作引用字符串 '$str' 并将其拉伸或缩减到指定长度。它
返回添加或剥离的字符数。 */
function str_const_len(&$str, $len, $char = ' ', $str_pad_const = STR_PAD_RIGHT) {
$origLen = strlen($str);
if (
strlen($str) < $len) { /* 拉伸字符串 */
$str = str_pad($str, $len, $char, $str_pad_const);
}
else {
/* 缩短字符串 */
switch ($str_pad_const) {
case
STR_PAD_LEFT:
$str = substr($str, (strlen($str) - $len), $len);
break;
case
STR_PAD_BOTH:
$shorten = (int) ((strlen($str) - $len) / 2);
$str = substr($str, $shorten, $len);
break;
default:
$str = substr($str, 0, $len);
break;
}
}
return (
$len - $origLen);
}
?>
-15
sergey
12 年前
你可以使用 trim 函数来清除字符串。

ltrim("0001230", "0") -> 1230
rtrim("0123000", "0") -> 0123
trim("0012300") -> 123
-4
babak dot asad73 at gmail dot com
4 年前
如何在数字前面添加一些 0
例如 5 ===> 005

像这样操作

echo str_pad(5,3,0,STR_PAD_LEFT); // 结果 005

echo str_pad(4,6,0,STR_PAD_LEFT); // 结果 000005
-8
pulketo at gmail dot com
7 年前
// Columnizer: 在文本列中添加填充,以符合最大列大小。
// 示例输入
$a='[1515] -> ID=1515 / post_date=2012-06-18 04:48:47 / post_name=review-terminatrix-by-sfam
[177] -> ID=177 / post_date=2017-05-12 12:12:03 / post_name=review-the-terminator-by-sfam
[228621100] -> ID=2286 / post_date=2012-06-18 04:48:32 / post_name=terminator-3-rise-of-the-machines-2003';

function columnize($input, $separator=" "){
$lines = explode("\n", $input);
foreach ($lines as $k=>$line){
$r[$k] = explode(" ", trim($line));
}
// print_r($r);
$nc = sizeOf($r[0]);
// echo $nc;
for($i=0;$i<$nc;$i++){
$col[$i] = array_column($r, $i);
}
// print_r($col);
for ($i=0;$i<sizeof($col);$i++){
$maxlen = max(array_map('strlen', $col[$i]));
$tam[$i]=$maxlen;
// echo "$i:$maxlen".PHP_EOL;
$cs[$i]=$maxlen;
}
// print_r($cs);
$o="";
for ($r=0;$r<sizeOf($lines);$r++){
for ($c=0;$c<sizeof($cs);$c++){
$o.= str_pad($col[$c][$r], $cs[$c]+2, " ", STR_PAD_RIGHT );
}
$o .= PHP_EOL;
}
return $o;
}

echo $columnize($a);
// 将以列的形式输出文本 :)
To Top