字符串函数
在线手册:中文  英文

str_pad

(PHP 4 >= 4.0.1, PHP 5)

str_pad使用另一个字符串填充字符串为指定长度

说明

string str_pad ( string $input , int $pad_length [, string $pad_string = " " [, int $pad_type = STR_PAD_RIGHT ]] )

该函数返回 input 被从左端、右端或者同时两端被填充到制定长度后的结果。如果可选的 pad_string 参数没有被指定,input 将被空格字符填充,否则它将被 pad_string 填充到指定长度。

参数

input

输入字符串。

pad_length

如果 pad_length 的值是负数,小于或者等于输入字符串的长度,不会发生任何填充。

pad_string

Note:

如果填充字符的长度不能被 pad_string 整除,那么 pad_string 可能会被缩短。

pad_type

可选的 pad_type 参数的可能值为 STR_PAD_RIGHTSTR_PAD_LEFTSTR_PAD_BOTH。如果没有指定 pad_type,则假定它是 STR_PAD_RIGHT

返回值

返回填充后的字符串。

范例

Example #1 str_pad() 范例

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


字符串函数
在线手册:中文  英文

用户评论:

qeremy [atta] gmail [dotta] com (2013-01-20 01:44:44)

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($result0$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), 0floor($length)) 
                    . 
$str 
                       
mb_substr(str_repeat($pad_str$repeat), 0ceil($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: ?...?? 
...

sergey (2011-10-12 02:45:42)

You can use trim functions for clearpad string:
ltrim("0001230", "0") -> 1230
rtrim("0123000", "0") -> 0123
trim("0012300") -> 123

gene at swipesy dot com (2011-09-24 21:18:15)

This is how I pad using &nbsp; :
str_replace(" ", "&nbsp;&nbsp;", str_pad($foo, 10, " ", STR_PAD_LEFT))
Seems to work well using two &nbsp; tags for each character added, at least for my use. YMMV.

goellerk at bucks dot edu (2010-06-07 12:43:07)

Apparently, as of 5.3.2 the notations "STR_PAD_LEFT" and "STR_PAD_RIGHT" are case sensitive.
$yr = "10";
$yr = str_pad($yr,2,'0',str_pad_left);
print "yr = '$yr'";
yr = ' '
$yr = "10";
$yr = str_pad($yr,2,'0',STR_PAD_LEFT);
print "yr = '$yr'";
yr = '10'

hernanc (2009-04-24 08:45:48)

To get Monday and Sunday's dates of the current week in Y-m-d format  do:

<?php
$mon_date 
date('Y-m-d',strtotime(date('Y') . 'W' str_pad(date('W'), 2'0',STR_PAD_LEFT) .'1'));
$sun_date =  date('Y-m-d',strtotime(date('Y') . 'W' str_pad(date('W'), 2'0',STR_PAD_LEFT).'7'));
?>

Kari &#34;Haprog&#34; Sderholm (2009-03-21 06:43:14)

Here's a quick and simple way to make an mb_str_pad function that works when you have correctly set your internal encoding.

I'm not sure how well this works in all possible scenarios but atleast it worked for me using UTF-8 as internal encoding and using this function on strings containing scandinavian characters "??????" that are double byte in 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);
}
?>

matrebatre (2008-10-16 11:28:10)

Here is a simple function to convert numbers into strings like this:

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 indicates how many characters you want.

albert dot serra at camaleongroup dot com (2008-07-22 06:36:47)

<?php
/** Description
   * padclear, clear a pad varchar(9) "*****HOME" -> varchar(4) "HOME"
   * _no use for INT_ : varchar(5) "00100" -> int(3) "100", use $number = (int) "00100";
   *
   * @param string, string original
   * @param char, character to replace
   * @param charreplace, final character
   * @param type, [STR_PAD_RIGHT|STR_PAD_LEFT] see str_pad
   * @return string, transformed string with charreplace
   */
  
function padclear($string$char$charreplace null,$type STR_PAD_RIGHT) {

      
$strlen strlen($string) - 1;
      
$i = ($type == STR_PAD_RIGHT) ? $strlen;
      
$stop = ($type == STR_PAD_RIGHT) ? $strlen 0;
      
$difpos null;
      while(
is_null($difpos) && $i != $stop) {
        
$difpos = ($string[$i] != $char) ? $i null;
        if(
$type == STR_PAD_RIGHT$i++;
        else 
$i--;
      }

      if(
$type == STR_PAD_RIGHT) {
        
$ant str_replace($char,$charreplace,substr($string,0,$difpos));
         
$nxt substr($string,$difpos,$strlen);
      } else {
        
$ant substr($string,0,$difpos);
        
$nxt str_replace($char,$charreplace,substr($string,$difpos,$strlen));
      }

      return 
$ant $nxt;
  }

  
$string "HOME*******";
  echo 
padclear($string,'*','',STR_PAD_LEFT);  // HOME
  
$string "*****HOME";
  echo 
padclear($string,'*','',STR_PAD_RIGHT); // HOME
?>

bxi at apparoat dot nl (2008-03-20 06:17:20)

In case you want to pad 2 strings together with a character you can use:

<?php
function pad_between_strings($string1$string2$length$char " ") {
    
$fill_length $length - ( strlen($string1) + strlen($string2) );
    return 
$string1 str_repeat($char$fill_length) . $string2;
}
?>

Spudley (2007-07-18 08:47:54)

Warning: If your string includes non-ascii characters (eg the British pounds sign), str_pad() will treat these as two characters when calculating the padding.

So for example:
<?php
str_pad
($currency_symbol.$showtottopay,12," ",STR_PAD_LEFT);
?>
will produce a different length string depending on whether $currency_symbol is pounds or dollars.

Hope this helps someone -- it caused me a lot of problems with misaligned columns in my invoices until I worked it out.

christian dot reinecke at web dot de (2007-04-01 10:43:56)

Fills the first argument (mostly a number, f.e. from a <select> loop to display a date or time) with zeroes.

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

sprintf() is indeed faster than str_pad.

Charles (2006-12-05 15:53:21)

More corrections to the original flap / Tomek Krzeminski code below (well someone has to check it!) -- the code is a bit mangled but it is still the same:

<?php

function mb_str_pad($ps_input$pn_pad_length$ps_pad_string " "$pn_pad_type STR_PAD_RIGHT$ps_encoding NULL) {
  
$ret "";

  if (
is_null($ps_encoding))
    
$ps_encoding mb_internal_encoding();

  
$hn_length_of_padding $pn_pad_length mb_strlen($ps_input$ps_encoding);
  
$hn_psLength mb_strlen($ps_pad_string$ps_encoding); // pad string length
   
  
if ($hn_psLength <= || $hn_length_of_padding <= 0) {
    
// Padding string equal to 0:
    //
    
$ret $ps_input;
    }
  else {
    
$hn_repeatCount floor($hn_length_of_padding $hn_psLength); // how many times repeat

    
if ($pn_pad_type == STR_PAD_BOTH) {
      
$hs_lastStrLeft "";
      
$hs_lastStrRight "";
      
$hn_repeatCountLeft $hn_repeatCountRight = ($hn_repeatCount $hn_repeatCount 2) / 2;

      
$hs_lastStrLength $hn_length_of_padding $hn_repeatCountLeft $hn_psLength// the rest length to pad
      
$hs_lastStrLeftLength $hs_lastStrRightLength floor($hs_lastStrLength 2);      // the rest length divide to 2 parts
      
$hs_lastStrRightLength += $hs_lastStrLength 2// the last char add to right side

      
$hs_lastStrLeft mb_substr($ps_pad_string0$hs_lastStrLeftLength$ps_encoding);
      
$hs_lastStrRight mb_substr($ps_pad_string0$hs_lastStrRightLength$ps_encoding);

      
$ret str_repeat($ps_pad_string$hn_repeatCountLeft) . $hs_lastStrLeft;
      
$ret .= $ps_input;
      
$ret .= str_repeat($ps_pad_string$hn_repeatCountRight) . $hs_lastStrRight;
      }
    else {
      
$hs_lastStr mb_substr($ps_pad_string0$hn_length_of_padding $hn_psLength$ps_encoding); // last part of pad string

      
if ($pn_pad_type == STR_PAD_LEFT)
        
$ret str_repeat($ps_pad_string$hn_repeatCount) . $hs_lastStr $ps_input;
      else
        
$ret $ps_input str_repeat($ps_pad_string$hn_repeatCount) . $hs_lastStr;
      }
    }

  return 
$ret;
  }

?>

rafaeljaquestudojunto at gmail dot com (2006-09-11 05:43:44)

Looking forward to make some dynamic tabulation, i've noticed that the output appeared twice. I suppose that the parser recognize \t, \n and any other special character as a single character...

So.. If you need 4 tabulatins, just make...

<?php

print str_pad('',4,"\t");

?>

Silvio Ginter (silvio dot ginter at gmx dot de) (2005-11-15 08:43:50)

Hello,

for anyone who needs this, I wrote this extension to str_pad. For details, just look at the comments.

<?php

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

    
    
/*     This function is an extension to str_pad, it manipulates the referenced
    string '$str' and stretches or reduces it to the specified length. It
    returns the number of characters, that were added or stripped. */
function str_const_len(&$str$len$char ' '$str_pad_const STR_PAD_RIGHT) {
    
$origLen strlen($str);
    if (
strlen($str) < $len) {     /* stretch string */
        
$str str_pad($str$len$char$str_pad_const);
    }
    else {                         
/* reduce string */
        
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($str0$len);
                break;
        }
    }
    return (
$len $origLen);
}
?>

private dot email at optusnet dot com dot au (2005-08-10 05:04:20)

I wrote these 3 functions that live in a library i include in every programme. I find them useful, and the syntax is easy.

<?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 );
    
$str str_pad $string $i $padchar STR_PAD_BOTH );
    return 
$str;
}

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

Hope this can help someone!

zubfatal <root at it dot dk> (2005-03-27 21:28:08)

<?php
    
/**
     * str_pad_html - Pad a string to a certain length with another string.
     * accepts HTML code in param: $strPadString.
     * 
     * @name        str_pad_html()
     * @author        Tim Johannessen <root@it.dk>
     * @version        1.0.0
     * @param        string    $strInput    The array to iterate through, all non-numeric values will be skipped.
     * @param        int    $intPadLength    Padding length, must be greater than zero.
     * @param        string    [$strPadString]    String to pad $strInput with (default: &nbsp;)
     * @param        int        [$intPadType]        STR_PAD_LEFT, STR_PAD_RIGHT (default), STR_PAD_BOTH
     * @return        string    Returns the padded 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)))) / 20);
                    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;
        }
    }

?>

tacomage at NOSPAM dot devilishly-deviant dot net (2004-07-07 20:04:41)

If you want to pad a string to a certain screen length with &nbsp; or other HTML entities, but don't want to risk messing up any HTML characters inside the string, try this:

<?php
function str_pad_as_single($input$len$pad$flag=STR_PAD_RIGHT)
{
  
$trans=array('$'=>$input,' '=>$pad);
  
$output=str_pad('$',$len-strlen($input)+1,' ',$flag);
  
$output=strtr($output,$trans);
  return 
$output;
}
echo 
str_pad_as_single('<img src="some.gif">',22,'&nbsp;');
// will output <img src="some.gif">&nbsp;&nbsp;

echo str_pad_as_single('<img src="some.gif">',22,'&nbsp;',STR_PAD_BOTH);
// will output &nbsp;<img src="some.gif">&nbsp;

echo str_pad_as_single('<img src="some.gif">',22,'&nbsp;',STR_PAD_LEFT);
// will output &nbsp;&nbsp;<img src="some.gif">
?>

It works by using single characters for str_pad, then replacing the characters with the full strings using strtr, so the two strings can't interfere with each other.  It also conveniently has the same syntax as str_pad.  Yes, I realize that spacing an image with text isn't the best idea, but it's just an example, it'll apply to other HTML as well :-P

giorgio dot balestrieri at mail dot wind dot it (2004-03-09 08:49:47)

For number formatting (like writing numbers with leading zeroes etc.) , sprintf is much faster than str_pad.
Consider the following snippet (it take some minutes to run):

<?php
  
echo "str_pad test started, please wait...\n";
  
  
$intStart time();
  for (
$idx 1$idx <= 10000000$idx++)
    
$strFoo str_pad($idx10"0"STR_PAD_LEFT);
  
$intEnd time();
  
  echo 
"str_pad cycle completed in " . ($intEnd $intStart) . " seconds\n";
  echo 
"sprintf test started, please wait...\n";  
  
  
$intStart time();
  for (
$idx 1$idx <= 10000000$idx++)
    
$strFoo sprintf("%010d"$idx);
  
$intEnd time();
  
  echo 
"sprintf cycle completed in " . ($intEnd $intStart) . " seconds\n";
?>

The str_pad cyle runs 80-100% slower on my pc...

bob [at] bobarmadillo [dot] com (2002-12-03 09:22:49)

In a lot of cases you're better off using str_repeat if you want to use something like   - it repeats the entire string.

Using str_repeat, I wrote a full string pad function that should closely mimic str_pad in every other way:

<?php
function full_str_pad($input$pad_length$pad_string ''$pad_type 0) {
 
$str '';
 
$length $pad_length strlen($input);
 if (
$length 0) { // str_repeat doesn't like negatives
  
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_stringfloor($length/2));
   
$str .= $input;
   
$str .= str_repeat($pad_stringceil($length/2));
  } else { 
// defaults to STR_PAD_LEFT == 0
   
$str str_repeat($pad_string$length).$input;
  }
 } else { 
// if $length is negative or zero we don't need to do anything
  
$str $input;
 }
 return 
$str;
}

$pad_me "Test String";
echo 
'|'.full_str_pad($pad_me20' ')."|\n";
echo 
'|'.full_str_pad($pad_me20' 'STR_PAD_RIGHT)."|\n";
echo 
'|'.full_str_pad($pad_me20' 'STR_PAD_BOTH)."|\n";
?>

david dot rensonnet at swing dot be (2002-12-02 03:18:34)

my solution to saveloywill at netscape dot net:
$myvar2="Alien";
$myvar=str_pad($myvar2,15," ",STR_PAD_RIGHT);
$myvar=str_replace(" ","&nbsp;",$myvar);
this way, only complete spaces will show up.
enjoy!
david rensonnet

Fahad dot Gilani at anu dot edu dot au (2002-12-02 02:22:43)

Basically, *all* of you guys have a 'long' way of padding text with html tags (which includes &nbsp;) You dont even have to do a str_replace... try the following code and this will work with ANY html tag there is out there and you don't have to worry about tag character lengths so on and so forth:
<?
  $text = "This is pretty interesting!";
  $pad_string = "&nbsp;";
  
  //Pad text on both sides 
  $text = str_pad($text, strlen($text)+(20*strlen($pad_string)), $pad_string, STR_PAD_BOTH);
  print $text." Dont you think?";
?>
Will produce:
          This is pretty interesting!           Dont you think?

Cheers,
Fahad

no dot spam at no dot spam dot no (2002-09-26 16:28:50)

there could already be spaces in the string.
1) strlen the string
2) replace spaces with "AUniqueString"
3) strlen the new string
4) compare the two strlen's
5) pad as needed considering the new strlen
6) finally, replace all "AUniqueString" 's with &nbsp; 's
hack & a half, slow as well i bet

cd579 at hotmail dot com (2002-08-22 13:53:41)

Why not just use a space[' '] instead of a character that COULD be inside the string, and risk messing it up? Example:
$string = 'test';
$string = str_pad($string, 10, " ", STR_PAD_BOTH);
// $string now equals ' test'
$string = str_replace(" ", "&nbsp;", $string);

mreilly at NOSPAM dot mac dot com (2002-08-20 11:23:34)

When provided with a string of characters as the pad value, str_pad uses all the characters as fill, and can leave partial strings. (eg. If the pad value is 'ABC' and it needs 5 characters to pad with, it outputs 'ABCAB'.) This is a problem when you want to pad with non-breaking spaces, the code for which is 6 characters long.
This can be resolved by first padding the string with a single character that won't be found in the strings such as * then doing a str_replace of * with &nbsp;.

saveloywill at netscape dot net (2002-08-10 12:50:53)

Here is my solution to the above problem.
Simply place the code in question inbetween  html <pre> tags, like this:

<?php
print "<pre>";
$input "Alien";
print 
str_pad($input10);
print 
"*";
print 
"</pre>";
?>

Thanks.

pozytron#mac#com (2002-07-08 14:20:18)

The trouble with cj@NOSPAM.ceejayoz.com's version over pestilenc@hotmail.com's is that many of the times it is used, it will end up with fragments of the "&nbsp;" code.

For example, the following code:
<?php
echo str_pad("TESTSTRING",60,"&nbsp;",STR_PAD_BOTH);
?>

produces the following HTML output:
&nbsp;&nbsp;&nbsp;&nbsp;&TESTSTRING&nbsp;&nbsp;&nbsp;&nbsp;&

cj at NOSPAM dot ceejayoz dot com (2002-06-17 12:38:14)

Another solution to no_email@php.net's problem would be to simply multiply the padding string by 6.
e.g.
$string = str_pad($string, 10, "&nbsp;", STR_PAD_BOTH);
becomes
$string = str_pad($string, 60, "&nbsp;", STR_PAD_BOTH);
which will avoid problems with the above solution, which will mess up text that has the * in it (or whichever character you're replacing)

pestilenc at hotmail dot com (2002-06-06 04:26:44)

For me this worked.
$string = 'help';
#First, str_pad() with unique character.
$string = str_pad($string, 10, "*", STR_PAD_BOTH);
#$string = '***help***';
#Second, str_replace with '&nbsp;'
$string = str_replace("*", "&nbsp;", $string);

no_email at php dot net (2002-05-30 10:34:19)

To convert your string couldnt you just use strval($var)?
What if you want non-breaking spaces? If I try to str_pad with "&nbsp;" PHP thinks my padding string is 6 characters, whn in HTML it is only one.

jared at dctkc dot com (2002-05-03 16:25:17)

matthew.somerville's code did NOT work for me.
neither did bert@catsburg.com's.
neither did any other documentation.
(if I isolated the code by itself, they all worked; but in the context I was using it, $value was numeric, and there is NO WAY to force it to be a string in PHP).
I had to roll my own. I used 'trim' to _force_
the value of $value to be string, because as
long as PHP thought it was numeric, I could
not use any form of left-padding with zeros.
This worked (I use sprintf to left-pad
$value with zeros to a length of 4):
sprintf("%04s",trim($value));

matthew dot somerville at trinity dot oxford dot ac dot uk (2001-08-05 06:53:15)

I find:
$mystr = substr("0000$mystr",-4)
(where the 0s are padding characters and -4 is the negative of the maxlength to pad to) is even simpler.

易百教程