虽然PHP自带的函数库很强大,但是在日常很多情况下,我们也还得自己写自定义的函数去实现某些功能与需求。下面收集了一些比较实用的、解决一些常见需求的自定义函数,比如将网址字符串转换成超级链接、列出目录内容、验证邮件地址等等,如果你觉得好,可以收藏本页,方便以后翻阅~
1. PHP可阅读随机字符串
此代码将创建一个可阅读的字符串,使其更接近词典中的单词,实用且具有密码验证功能。
04 | function readable_random_string( $length = 6){ |
05 | $conso = array ( "b" , "c" , "d" , "f" , "g" , "h" , "j" , "k" , "l" , |
06 | "m" , "n" , "p" , "r" , "s" , "t" , "v" , "w" , "x" , "y" , "z" ); |
07 | $vocal = array ( "a" , "e" , "i" , "o" , "u" ); |
09 | srand ((double)microtime()*1000000); |
11 | for ( $i =1; $i <= $max ; $i ++) |
13 | $password .= $conso [rand(0,19)]; |
14 | $password .= $vocal [rand(0,4)]; |
2. PHP生成一个随机字符串
如果不需要可阅读的字符串,使用此函数替代,即可创建一个随机字符串,作为用户的随机密码等。
04 | function generate_rand( $l ){ |
05 | $c = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" ; |
06 | srand((double)microtime()*1000000); |
07 | for ( $i =0; $i < $l ; $i ++) { |
08 | $rand .= $c [rand()% strlen ( $c )]; |
3. PHP编码电子邮件地址
使用此代码,可以将任何电子邮件地址编码为 html 字符实体,以防止被垃圾邮件程序收集。
01 | function encode_email( $email = 'info@domain.com' , $linkText = 'Contact Us' , $attrs = 'class="emailencoder"' ) |
04 | $email = str_replace ( '@' , '@' , $email ); |
05 | $email = str_replace ( '.' , '.' , $email ); |
06 | $email = str_split ( $email , 5); |
08 | $linkText = str_replace ( '@' , '@' , $linkText ); |
09 | $linkText = str_replace ( '.' , '.' , $linkText ); |
10 | $linkText = str_split ( $linkText , 5); |
12 | $part1 = '<a href="ma' ; |
14 | $part3 = '" ' . $attrs . ' >' ; |
17 | $encoded = '<script type="text/javascript">' ; |
18 | $encoded .= "document.write('$part1');" ; |
19 | $encoded .= "document.write('$part2');" ; |
22 | $encoded .= "document.write('$e');" ; |
24 | $encoded .= "document.write('$part3');" ; |
25 | foreach ( $linkText as $l ) |
27 | $encoded .= "document.write('$l');" ; |
29 | $encoded .= "document.write('$part4');" ; |
30 | $encoded .= '</script>' ; |
4. PHP验证邮件地址
电子邮件验证也许是中最常用的网页表单验证,此代码除了验证电子邮件地址,也可以选择检查邮件域所属 DNS 中的 MX 记录,使邮件验证功能更加强大。
01 | function is_valid_email( $email , $test_mx = false) |
03 | if ( eregi ( "^([_a-z0-9-]+)(\.[_a-z0-9-]+)*@([a-z0-9-]+)(\.[a-z0-9-]+)*(\.[a-z]{2,4})$" , $email )) |
06 | list( $username , $domain ) = split( "@" , $email ); |
07 | return getmxrr ( $domain , $mxrecords ); |
5. PHP列出目录内容
01 | function list_files( $dir ) |
05 | if ( $handle = opendir( $dir )) |
07 | while (( $file = readdir( $handle )) !== false) |
09 | if ( $file != "." && $file != ".." && $file != "Thumbs.db" ) |
11 | echo '<a target="_blank" href="' . $dir . $file . '">' . $file . '</a><br>' . "\n" ; |
6. PHP销毁目录
删除一个目录,包括它的内容。
05 | function destroyDir( $dir , $virtual = false) |
07 | $ds = DIRECTORY_SEPARATOR; |
08 | $dir = $virtual ? realpath ( $dir ) : $dir ; |
09 | $dir = substr ( $dir , -1) == $ds ? substr ( $dir , 0, -1) : $dir ; |
10 | if ( is_dir ( $dir ) && $handle = opendir( $dir )) |
12 | while ( $file = readdir( $handle )) |
14 | if ( $file == '.' || $file == '..' ) |
18 | elseif ( is_dir ( $dir . $ds . $file )) |
20 | destroyDir( $dir . $ds . $file ); |
24 | unlink( $dir . $ds . $file ); |
7. PHP解析 JSON 数据
与大多数流行的 Web 服务如 twitter 通过开放 API 来提供数据一样,它总是能够知道如何解析 API 数据的各种传送格式,包括 JSON,XML 等等。
1 | $json_string = '{"id":1,"name":"foo","email":"foo@foobar.com","interest":["wordpress","php"]} ' ; |
2 | $obj =json_decode( $json_string ); |
8. PHP解析 XML 数据
02 | $xml_string ="<?xml version= '1.0' ?> |
06 | <email>foo@bar.com</name> |
10 | <email>foobar@foo.com</name> |
15 | $xml = simplexml_load_string( $xml_string ); |
18 | foreach ( $xml ->user as $user ) |
21 | echo $user [ 'id' ], ' ' ; |
23 | echo $user ->name, ' ' ; |
24 | echo $user ->email, '<br />' ; |
9. PHP创建日志缩略名
创建用户友好的日志缩略名。
1 | function create_slug( $string ){ |
2 | $slug =preg_replace( '/[^A-Za-z0-9-]+/' , '-' , $string ); |
10. PHP获取客户端真实 IP 地址
该函数将获取用户的真实 IP 地址,即便他使用代理服务器。
01 | function getRealIpAddr() |
03 | if (!emptyempty( $_SERVER [ 'HTTP_CLIENT_IP' ])) |
05 | $ip = $_SERVER [ 'HTTP_CLIENT_IP' ]; |
07 | elseif (!emptyempty( $_SERVER [ 'HTTP_X_FORWARDED_FOR' ])) |
10 | $ip = $_SERVER [ 'HTTP_X_FORWARDED_FOR' ]; |
14 | $ip = $_SERVER [ 'REMOTE_ADDR' ]; |
11. PHP强制性文件下载
为用户提供强制性的文件下载功能。
04 | function force_download( $file ) |
06 | if ((isset( $file ))&&( file_exists ( $file ))) { |
07 | header( "Content-length: " . filesize ( $file )); |
08 | header( 'Content-Type: application/octet-stream' ); |
09 | header( 'Content-Disposition: attachment; filename="' . $file . '"' ); |
13 | echo "No file selected" ; |
12. PHP创建标签云
01 | function getCloud( $data = array (), $minFontSize = 12, $maxFontSize = 30 ) |
03 | $minimumCount = min( array_values ( $data ) ); |
04 | $maximumCount = max( array_values ( $data ) ); |
05 | $spread = $maximumCount - $minimumCount ; |
09 | $spread == 0 && $spread = 1; |
11 | foreach ( $data as $tag => $count ) |
13 | $size = $minFontSize + ( $count - $minimumCount ) |
14 | * ( $maxFontSize - $minFontSize ) / $spread ; |
15 | $cloudTags [] = '<a style="font-size: ' . floor ( $size ) . 'px' |
16 | . '" href="#" title="\'' . $tag . |
17 | '\' returned a count of ' . $count . '">' |
18 | . htmlspecialchars( stripslashes ( $tag ) ) . '</a>' ; |
21 | return join( "\n" , $cloudTags ) . "\n" ; |
25 | $arr = Array( 'Actionscript' => 35, 'Adobe' => 22, 'Array' => 44, 'Background' => 43, |
26 | 'Blur' => 18, 'Canvas' => 33, 'Class' => 15, 'Color Palette' => 11, 'Crop' => 42, |
27 | 'Delimiter' => 13, 'Depth' => 34, 'Design' => 8, 'Encode' => 12, 'Encryption' => 30, |
28 | 'Extract' => 28, 'Filters' => 42); |
29 | echo getCloud( $arr , 12, 36); |
13. PHP寻找两个字符串的相似性
PHP 提供了一个极少使用的 similar_text 函数,但此函数非常有用,用于比较两个字符串并返回相似程度的百分比。
1 | similar_text( $string1 , $string2 , $percent ); |
14. PHP在应用程序中使用 Gravatar 通用头像
随着 WordPress 越来越普及,Gravatar 也随之流行。由于 Gravatar 提供了易于使用的 API,将其纳入应用程序也变得十分方便。
07 | function show_gravatar( $email , $size , $default , $rating ) |
10 | '&default=' . $default . '&size=' . $size . '&rating=' . $rating . '" width="' . $size .'px" |
11 | height= "'.$size.'px" />'; |
15. PHP在字符断点处截断文字
所谓断字 (word break),即一个单词可在转行时断开的地方。这一函数将在断字处截断字符串。
03 | function myTruncate( $string , $limit , $break = "." , $pad = "..." ) { |
05 | if ( strlen ( $string ) <= $limit ) |
09 | if (false !== ( $breakpoint = strpos ( $string , $break , $limit ))) { |
10 | if ( $breakpoint < strlen ( $string ) - 1) { |
11 | $string = substr ( $string , 0, $breakpoint ) . $pad ; |
17 | $short_string =myTruncate( $long_string , 100, ' ' ); |
16. PHP文件 Zip 压缩
02 | function create_zip( $files = array (), $destination = '' , $overwrite = false) { |
04 | if ( file_exists ( $destination ) && ! $overwrite ) { return false; } |
06 | $valid_files = array (); |
08 | if ( is_array ( $files )) { |
10 | foreach ( $files as $file ) { |
12 | if ( file_exists ( $file )) { |
13 | $valid_files [] = $file ; |
18 | if ( count ( $valid_files )) { |
20 | $zip = new ZipArchive(); |
21 | if ( $zip ->open( $destination , $overwrite ? ZIPARCHIVE::OVERWRITE : ZIPARCHIVE::CREATE) !== true) { |
25 | foreach ( $valid_files as $file ) { |
26 | $zip ->addFile( $file , $file ); |
35 | return file_exists ( $destination ); |
43 | $files = array ( 'file1.jpg' , 'file2.jpg' , 'file3.gif' ); |
44 | create_zip( $files , 'myzipfile.zip' , true); |
17. PHP解压缩 Zip 文件
05 | function unzip_file( $file , $destination ){ |
07 | $zip = new ZipArchive() ; |
09 | if ( $zip ->open( $file ) !== TRUE) { |
10 | die (’Could not open archive’); |
13 | $zip ->extractTo( $destination ); |
16 | echo 'Archive extracted to directory' ; |
18. PHP为 URL 地址预设 http 字符串
有时需要接受一些表单中的网址输入,但用户很少添加 http:// 字段,此代码将为网址添加该字段。
1 | if (!preg_match( "/^(http|ftp):/" , $_POST [ 'url' ])) { |
2 | $_POST [ 'url' ] = 'http://' . $_POST [ 'url' ]; |
19. PHP将网址字符串转换成超级链接
该函数将 URL 和 E-mail 地址字符串转换为可点击的超级链接。
01 | function makeClickableLinks( $text ) { |
02 | $text = eregi_replace ( '(((f|ht){1}tp://)[-a-zA-Z0-9@:%_+.~#?&//=]+)' , |
03 | '<a href="\1">\1</a>' , $text ); |
04 | $text = eregi_replace ( '([[:space:]()[{}])(www.[-a-zA-Z0-9@:%_+.~#?&//=]+)' , |
05 | '\1<a href="http://\2">\2</a>' , $text ); |
06 | $text = eregi_replace ( '([_.0-9a-z-]+@([0-9a-z][0-9a-z-]+.)+[a-z]{2,3})' , |
07 | '<a href="mailto:\1">\1</a>' , $text ); |
20. PHP调整图像尺寸
创建图像缩略图需要许多时间,此代码将有助于了解缩略图的逻辑。
07 | function resize_image( $filename , $tmpname , $xmax , $ymax ) |
09 | $ext = explode ( "." , $filename ); |
10 | $ext = $ext [ count ( $ext )-1]; |
12 | if ( $ext == "jpg" || $ext == "jpeg" ) |
13 | $im = imagecreatefromjpeg( $tmpname ); |
15 | $im = imagecreatefrompng( $tmpname ); |
17 | $im = imagecreatefromgif( $tmpname ); |
22 | if ( $x <= $xmax && $y <= $ymax ) |
27 | $newy = $newx * $y / $x ; |
31 | $newx = $x / $y * $newy ; |
34 | $im2 = imagecreatetruecolor( $newx , $newy ); |
35 | imagecopyresized( $im2 , $im , 0, 0, 0, 0, floor ( $newx ), floor ( $newy ), $x , $y ); |
21. PHP检测 ajax 请求
大多数的 JavaScript 框架如 jquery,Mootools 等,在发出 Ajax 请求时,都会发送额外的 HTTP_X_REQUESTED_WITH 头部信息,头当他们一个ajax请求,因此你可以在服务器端侦测到 Ajax 请求。
1 | if (!emptyempty( $_SERVER [ 'HTTP_X_REQUESTED_WITH' ]) && strtolower ( $_SERVER [ 'HTTP_X_REQUESTED_WITH' ]) == 'xmlhttprequest' ){ |
22. 关键词高亮
1 | function highlight( $sString , $aWords ) { |
2 | if (! is_array ( $aWords ) || emptyempty ( $aWords ) || ! is_string ( $sString )) { |
6 | $sWords = implode ( '|' , $aWords ); |
7 | return preg_replace ( '@\b(' . $sWords . ')\b@si' , '<strong style="background-color:yellow">$1</strong>' , $sString ); |
23. 获取你的Feedburner的用户
01 | function get_average_readers( $feed_id , $interval = 7){ |
02 | $today = date ( 'Y-m-d' , strtotime ( "now" )); |
03 | $ago = date ( 'Y-m-d' , strtotime ( "-" . $interval . " days" )); |
06 | curl_setopt( $ch , CURLOPT_RETURNTRANSFER, 1); |
07 | curl_setopt( $ch , CURLOPT_URL, $feed_url ); |
08 | $data = curl_exec( $ch ); |
10 | $xml = new SimpleXMLElement( $data ); |
11 | $fb = $xml ->feed->entry[ 'circulation' ]; |
14 | foreach ( $xml ->feed->children() as $circ ){ |
15 | $nb += $circ [ 'circulation' ]; |
18 | return round ( $nb / $interval ); |
24. 自动生成密码
01 | function generatePassword( $length =9, $strength =0) { |
03 | $consonants = 'bdghjmnpqrstvz' ; |
05 | $consonants .= 'BDGHJLMNPQRSTVWXZ' ; |
11 | $consonants .= '23456789' ; |
13 | if ( $strength >= 8 ) { |
19 | for ( $i = 0; $i < $length ; $i ++) { |
21 | $password .= $consonants [(rand() % strlen ( $consonants ))]; |
24 | $password .= $vowels [(rand() % strlen ( $vowels ))]; |
25. 压缩多个CSS文件
01 | header( 'Content-type: text/css' ); |
03 | function compress( $buffer ) { |
05 | $buffer = preg_replace( '!/\*[^*]*\*+([^/][^*]*\*+)*/!' , '' , $buffer ); |
07 | $buffer = str_replace ( array ( "\r\n" , "\r" , "\n" , "\t" , ' ' , ' ' , ' ' ), '' , $buffer ); |
13 | include ( 'typography.css' ); |
16 | include ( 'handheld.css' ); |
26. 获取短网址
1 | function getTinyUrl( $url ) { |
27. 根据生日计算年龄
03 | $time = strtotime ( $date ); |
08 | $date = date ( 'Y-m-d' , $time ); |
09 | list( $year , $month , $day ) = explode ( "-" , $date ); |
10 | $year_diff = date ( "Y" ) – $year ; |
11 | $month_diff = date ( "m" ) – $month ; |
12 | $day_diff = date ( "d" ) – $day ; |
13 | if ( $day_diff < 0 || $month_diff < 0) $year_diff –; |
28. 计算执行时间
02 | $time_start = microtime(true); |
07 | $time_end = microtime(true); |
09 | $time = $time_end - $time_start ; |
11 | echo 'Script took ' . $time . ' seconds to execute' ; |
29. PHP的维护模式
01 | function maintenance( $mode = FALSE){ |
03 | if ( basename ( $_SERVER [ 'SCRIPT_FILENAME' ]) != 'maintenance.php' ){ |
08 | if ( basename ( $_SERVER [ 'SCRIPT_FILENAME' ]) == 'maintenance.php' ){ |
30. 阻止CSS样式被缓存
1 | <link href= "/stylesheet.css?<?php echo time(); ?>" rel= "stylesheet" type= "text/css" /&glt; |
31. 为数字增加 st\nd\rd 等
01 | function make_ranked( $rank ) { |
02 | $last = substr ( $rank , -1 ); |
03 | $seclast = substr ( $rank , -2, -1 ); |
04 | if ( $last > 3 || $last == 0 ) $ext = 'th' ; |
05 | else if ( $last == 3 ) $ext = 'rd' ; |
06 | else if ( $last == 2 ) $ext = 'nd' ; |
09 | if ( $last == 1 && $seclast == 1) $ext = 'th' ; |
10 | if ( $last == 2 && $seclast == 1) $ext = 'th' ; |
11 | if ( $last == 3 && $seclast == 1) $ext = 'th' ; |