php-gene邮箱,PHP str_pad 用法 手册 | 示例代码

Marjune

since the default pad_type is STR_PAD_RIGHT. using STR_PAD_BOTH were always favor in the right pad if the required number of padding characters can't be evenly divided.

e.g

qeremy [atta] gmail [dotta] com

A proper unicode string padder;

mb_internal_encoding('utf-8');// @importantfunctionstr_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;

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:$s1n";

echo"len$sl2:$s2n";

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: Ä...ÄÖ

...

wes at nospamplsexample dot org

multibyte version:

{$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;

}?>

pestilenc at hotmail dot com

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 ' '

$string = str_replace("*", " ", $string);

mcinp

a different, more robust multibyte version of str_pad that works correctly only if $pad_string is non-multibyte 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);

}

Spudley

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:

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

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

{$sPrintfString='%0'. (int)$iLength.'s';

returnsprintf($sPrintfString,$mStretch);

}?>

sprintf() is indeed faster than str_pad.

bob [at] bobarmadillo [dot] com

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:

if ($length>0) {// str_repeat doesn't like negativesif ($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 {// 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_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";?>

NOSPAM dot php at my dot jrklein dot com

str_pad() can provide sufficient "zero padding" when using block ciphers and manual padding with openssl_encrypt() and similar.

The example below will pad the 6 character text "Secret" with two x00 characters and return 8 characters of data. Substitute your plain text and block size as needed.

$text="Secret";$block_size=8;$length=ceil(strlen($text) /$block_size) *$block_size;$data=str_pad($text,$length,"x00");

Anonymous

Here is the mcinp's version of mb_str_pad bugfixed:

returnstr_pad($input,$pad_length-$mb_diff,$pad_string,$pad_type);

}?>

Still working correctly only if $pad_string is non-multibyte string

bxi at apparoat dot nl

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

return$string1.str_repeat($char,$fill_length) .$string2;

}?>

gene at swipesy dot com

This is how I pad using   :

str_replace(" ", "  ", str_pad($foo, 10, " ", STR_PAD_LEFT))

Seems to work well using two   tags for each character added, at least for my use. YMMV.

zubfatal

* 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

* @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:  )

* @param        int        [$intPadType]        STR_PAD_LEFT, STR_PAD_RIGHT (default), STR_PAD_BOTH

* @return        string    Returns the padded string

**/functionstr_pad_html($strInput="",$intPadLength,$strPadString=" ",$intPadType=STR_PAD_RIGHT) {

if (strlen(trim(strip_tags($strInput)))

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

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

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

break;// STR_PAD_RIGHTdefault:$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;

}

}?>

matrebatre

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

0 => 0000

1 => 0001

20 => 0020

432 => 0432

returnstr_pad((int)$number,$n,"0",STR_PAD_LEFT);

}?>

$n indicates how many characters you want.

Kirill Fuchs

sprintf() is not always faster... It certainly scales a lot better then str_pad so when running a benchmark that pads 10k characters,  sprintf will come out on top. But if you benchmarked a more real world scenario, it seems str_pad comes out the clear winner.

$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 ran in 0.015974044799805 milliseconds

str_pad ran in 0.0059604644775391 milliseconds

Fahad dot Gilani at anu dot edu dot au

Basically, *all* of you guys have a 'long' way of padding text with html tags (which includes  ) 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 = " ";

//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

gtwizard

sprintf is faster

$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";

//result

sprintf ran in 2.0260810852051 milliseconds

str_pad ran in 26.59797668457 milliseconds

private dot email at optusnet dot com dot au

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

$str="test";

functionstr_pad_right($string,$padchar,$int) {$i=strlen($string) +$int;$str=str_pad($string,$i,$padchar,STR_PAD_RIGHT);

return$str;

}

functionstr_pad_left($string,$padchar,$int) {$i=strlen($string) +$int;$str=str_pad($string,$i,$padchar,STR_PAD_LEFT);

return$str;

}

functionstr_pad_both($string,$padchar,$int) {$i=strlen($string) + ($int*2);$str=str_pad($string,$i,$padchar,STR_PAD_BOTH);

return$str;

}

echostr_pad_left($str,"-",3);// Produces: ---testechostr_pad_right($str,"-",3);// Produces: test---echostr_pad_both($str,"-",3);// Produces: ---test---?>

Hope this can help someone!

Kari "Haprog" Sderholm

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.

returnstr_pad($input,$pad_length+$diff,$pad_string,$pad_type);

}?>

Silvio Ginter (silvio dot ginter at gmx dot de)

Hello,

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

$string='this is a test';$oldLen=strlen($string);$direction=STR_PAD_BOTH;

echo$string.'
';

echostr_const_len($string,101,'#',$direction).'
';

echo$string.'
';

echostr_const_len($string,$oldLen,'#',$direction).'
';

echo$string.'
'."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. */functionstr_const_len(&$str,$len,$char=' ',$str_pad_const=STR_PAD_RIGHT) {$origLen=strlen($str);

if (strlen($str)

}

else {/* reduce string */switch ($str_pad_const) {

caseSTR_PAD_LEFT:$str=substr($str, (strlen($str) -$len),$len);

break;

caseSTR_PAD_BOTH:$shorten= (int) ((strlen($str) -$len) /2);$str=substr($str,$shorten,$len);

break;

default:$str=substr($str,0,$len);

break;

}

}

return ($len-$origLen);

}?>

mreilly at NOSPAM dot mac dot com

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  .

Anonymous

For simple padding, you can use sprintf, which is faster:

see http://php.net/sprintf Example #5 "Specifying padding character"

sergey

You can use trim functions for clearpad string:

ltrim("0001230", "0") -> 1230

rtrim("0123000", "0") -> 0123

trim("0012300")     -> 123

pulketo at gmail dot com

// Columnizer: add padding into text columns according maximum column size.

// sample input:

$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

$col[$i] = array_column($r, $i);

}

// print_r($col);

for ($i=0;$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

for ($c=0;$c

$o.= str_pad($col[$c][$r], $cs[$c]+2, " ", STR_PAD_RIGHT );

}

$o .= PHP_EOL;

}

return $o;

}

echo $columnize($a);

// will output text nicely in columns :)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值