PHP QR Code生成二维码

在线生成URL:qr.outsiderla.me
HP QR Code是一个PHP二维码生成类库,利用它可以轻松生成二维码,官网提供了下载和多个演示demo,查看地址:http://phpqrcode.sourceforge.net/。
下 载官网提供的类库后,只需要使用phpqrcode.php就可以生成二维码了,当然您的PHP环境必须开启支持GD2。 phpqrcode.php提供了一个关键的png()方法,其中参数$text表示生成二位的的信息文本;参数$outfile表示是否输出二维码图片 文件,默认否;参数$level表示容错率,也就是有被覆盖的区域还能识别,分别是 L(QR_ECLEVEL_L,7%),M(QR_ECLEVEL_M,15%),Q(QR_ECLEVEL_Q,25%),H(QR_ECLEVEL_H,30%); 参数$size表示生成图片大小,默认是3;参数$margin表示二维码周围边框空白区域间距值;参数$saveandprint表示是否保存二维码并 显示。
. 代码如下:

public static function png($text, $outfile=false, $level=QR_ECLEVEL_L, $size=3, $margin=4, $saveandprint=false)    
{   
    $enc = QRencode::factory($level, $size, $margin);   
    return $enc->encodePNG($text, $outfile, $saveandprint=false);   
}

调用PHP QR Code非常简单,如下代码即可生成一张内容为”http://www.cnblogs.com/txw1958/”的二维码.

include 'phpqrcode.php'; 
QRcode::png('http://www.cnblogs.com/txw1958/');

那么实际应用中,我们会在二维码的中间加上自己的LOGO,已增强宣传效果。那如何生成含有logo的二维码呢?其实原理很简单,先使用PHP QR Code生成一张二维码图片,然后再利用php的image相关函数,将事先准备好的logo图片加入到刚生成的原始二维码图片中间,然后重新生成一张新 的二维码图片。
. 代码如下:

include 'phpqrcode.php';    
$value = 'http://www.cnblogs.com/txw1958/'; //二维码内容   
$errorCorrectionLevel = 'L';//容错级别   
$matrixPointSize = 6;//生成图片大小   
//生成二维码图片   
QRcode::png($value, 'qrcode.png', $errorCorrectionLevel, $matrixPointSize, 2);   
$logo = 'logo.png';//准备好的logo图片   
$QR = 'qrcode.png';//已经生成的原始二维码图   
 
if ($logo !== FALSE) {   
    $QR = imagecreatefromstring(file_get_contents($QR));   
    $logo = imagecreatefromstring(file_get_contents($logo));   
    $QR_width = imagesx($QR);//二维码图片宽度   
    $QR_height = imagesy($QR);//二维码图片高度   
    $logo_width = imagesx($logo);//logo图片宽度   
    $logo_height = imagesy($logo);//logo图片高度   
    $logo_qr_width = $QR_width / 5;   
    $scale = $logo_width/$logo_qr_width;   
    $logo_qr_height = $logo_height/$scale;   
    $from_width = ($QR_width - $logo_qr_width) / 2;   
    //重新组合图片并调整大小   
    imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width,   
    $logo_qr_height, $logo_width, $logo_height);   
}   
//输出图片   
imagepng($QR, 'helloweixin.png');   
echo '<img src="helloweixin.png" alt="" />';

由于二维码允许有一定的容错性,一般的二维码即使在遮住部分但仍然能够解码,经常我们扫描二维码的时候扫描到甚至不到一半时就能解码扫描结果,这是因为生成器会将部分信息重复表示来提高其容错度,这就是为什么我们在二维码中间加个LOGO图片并不影响解码结果的原因。

最后上自己的代码 :

&lt;?php
 
include "qrlib.php";
$data = "http://outsiderla.me"; // 二维码数据
$errorCorrectionLevel = "M"; // 纠错级别:L、M、Q、H
$matrixPointSize = 10; // 点的大小:1到10
$filename = "test.png"; // 生成的文件路径
QRcode::png($data, $filename, $errorCorrectionLevel, $matrixPointSize, 2); //在$filename处生成一张图片
 
 
$logo = 'log.JPG';
$QR = 'test.png';
 
if ($logo !== FALSE) {
 
    $QR = imagecreatefromstring(file_get_contents($QR));
    $logo = imagecreatefromstring(file_get_contents($logo));
    $QR_width = imagesx($QR);
    $QR_height = imagesy($QR);
    $logo_width = imagesx($logo);
    $logo_height = imagesy($logo);
    $logo_qr_width = $QR_width / 5;
    $scale = $logo_width / $logo_qr_width;
    $logo_qr_height = $logo_height / $scale;
    $from_width = ($QR_width - $logo_qr_width) / 2;
    imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width, $logo_qr_height, $logo_width, $logo_height);
}
imagepng($QR, 'test.png');
$image = fread(fopen($filename, r), filesize($filename));
header("Content-type: image/JPEG", true);
 
echo $image; //此处为了显示在页面上

来自:http://www.cnblogs.com/txw1958/p/phpqrcode.html

ajax jsonp

 $.ajax(  
        {  
            data:'',
            type:'post',  
            url : 'http://demo.test.com?page=2',  
            dataType : 'jsonp',  
            jsonpCallback:"jsoncallback", 
            success  : function(data) {  
               alert(data.page);
            }
 
        }

php:

header('Content-Type:text/html;Charset=utf-8');  
$arr = array(
    "user" => '222',
    "pass" => '333',
    "name" => 'response',
    'page'=>$_GET['page']
);
echo $_GET['callback'] . "(" . json_encode($arr) . ")";
die;

PHP 加密 js 解密

PHP:

<?php
 
function strencode($string) {
    $string = base64_encode($string);
    $key = md5('just a test');
    $len = strlen($key);
    $code = '';
    for ($i = 0; $i < strlen($string); $i++) {
        $k = $i % $len;
        $code .= $string [$i] ^ $key [$k];
    }
    return base64_encode($code);
}
 
echo strencode('just a test');
?>

JS:

<script src="md5.js"></script>
<script src="base64.js"></script>
<script>
 
    function strencode(string) {
        key =md5('just a test');
        string = Base64.decode(string); 
        len = key.length;   
        code = '';   
        for (i = 0; i < string.length; i++) {   
            k = i % len;   
            code += String.fromCharCode(string.charCodeAt(i) ^ key.charCodeAt(k));   
        }   
        return Base64.decode(code);   
    }
    alert(strencode('U1s1TFN3IQ0reTZbBgJlCA===='));   
</script>

js MD5:

/*
 * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
 * Digest Algorithm, as defined in RFC 1321.
 * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
 * Distributed under the BSD License
 * See http://pajhome.org.uk/crypt/md5 for more info.
 */
 
/*
 * Configurable variables. You may need to tweak these to be compatible with
 * the server-side, but the defaults work in most cases.
 */
var hexcase = 0;   /* hex output format. 0 - lowercase; 1 - uppercase        */
var b64pad  = "";  /* base-64 pad character. "=" for strict RFC compliance   */
 
/*
 * These are the functions you'll usually want to call
 * They take string arguments and return either hex or base-64 encoded strings
 */
function md5(s)    {
    return rstr2hex(rstr_md5(str2rstr_utf8(s)));
}
function b64_md5(s)    {
    return rstr2b64(rstr_md5(str2rstr_utf8(s)));
}
function any_md5(s, e) {
    return rstr2any(rstr_md5(str2rstr_utf8(s)), e);
}
function hex_hmac_md5(k, d)
{
    return rstr2hex(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d)));
}
function b64_hmac_md5(k, d)
{
    return rstr2b64(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d)));
}
function any_hmac_md5(k, d, e)
{
    return rstr2any(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d)), e);
}
 
/*
 * Perform a simple self-test to see if the VM is working
 */
function md5_vm_test()
{
    return hex_md5("abc").toLowerCase() == "900150983cd24fb0d6963f7d28e17f72";
}
 
/*
 * Calculate the MD5 of a raw string
 */
function rstr_md5(s)
{
    return binl2rstr(binl_md5(rstr2binl(s), s.length * 8));
}
 
/*
 * Calculate the HMAC-MD5, of a key and some data (raw strings)
 */
function rstr_hmac_md5(key, data)
{
    var bkey = rstr2binl(key);
    if(bkey.length > 16) bkey = binl_md5(bkey, key.length * 8);
 
    var ipad = Array(16), opad = Array(16);
    for(var i = 0; i < 16; i++)
    {
        ipad[i] = bkey[i] ^ 0x36363636;
        opad[i] = bkey[i] ^ 0x5C5C5C5C;
    }
 
    var hash = binl_md5(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
    return binl2rstr(binl_md5(opad.concat(hash), 512 + 128));
}
 
/*
 * Convert a raw string to a hex string
 */
function rstr2hex(input)
{
    try {
        hexcase
    } catch(e) {
        hexcase=0;
    }
    var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
    var output = "";
    var x;
    for(var i = 0; i < input.length; i++)
    {
        x = input.charCodeAt(i);
        output += hex_tab.charAt((x >>> 4) & 0x0F)
        +  hex_tab.charAt( x        & 0x0F);
    }
    return output;
}
 
/*
 * Convert a raw string to a base-64 string
 */
function rstr2b64(input)
{
    try {
        b64pad
    } catch(e) {
        b64pad='';
    }
    var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    var output = "";
    var len = input.length;
    for(var i = 0; i < len; i += 3)
    {
        var triplet = (input.charCodeAt(i) << 16)
        | (i + 1 < len ? input.charCodeAt(i+1) << 8 : 0)
        | (i + 2 < len ? input.charCodeAt(i+2)      : 0);
        for(var j = 0; j < 4; j++)
        {
            if(i * 8 + j * 6 > input.length * 8) output += b64pad;
            else output += tab.charAt((triplet >>> 6*(3-j)) & 0x3F);
        }
    }
    return output;
}
 
/*
 * Convert a raw string to an arbitrary string encoding
 */
function rstr2any(input, encoding)
{
    var divisor = encoding.length;
    var i, j, q, x, quotient;
 
    /* Convert to an array of 16-bit big-endian values, forming the dividend */
    var dividend = Array(Math.ceil(input.length / 2));
    for(i = 0; i < dividend.length; i++)
    {
        dividend[i] = (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1);
    }
 
    /*
   * Repeatedly perform a long division. The binary array forms the dividend,
   * the length of the encoding is the divisor. Once computed, the quotient
   * forms the dividend for the next step. All remainders are stored for later
   * use.
   */
    var full_length = Math.ceil(input.length * 8 /
        (Math.log(encoding.length) / Math.log(2)));
    var remainders = Array(full_length);
    for(j = 0; j < full_length; j++)
    {
        quotient = Array();
        x = 0;
        for(i = 0; i < dividend.length; i++)
        {
            x = (x << 16) + dividend[i];
            q = Math.floor(x / divisor);
            x -= q * divisor;
            if(quotient.length > 0 || q > 0)
                quotient[quotient.length] = q;
        }
        remainders[j] = x;
        dividend = quotient;
    }
 
    /* Convert the remainders to the output string */
    var output = "";
    for(i = remainders.length - 1; i >= 0; i--)
        output += encoding.charAt(remainders[i]);
 
    return output;
}
 
/*
 * Encode a string as utf-8.
 * For efficiency, this assumes the input is valid utf-16.
 */
function str2rstr_utf8(input)
{
    var output = "";
    var i = -1;
    var x, y;
 
    while(++i < input.length)
    {
        /* Decode utf-16 surrogate pairs */
        x = input.charCodeAt(i);
        y = i + 1 < input.length ? input.charCodeAt(i + 1) : 0;
        if(0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF)
        {
            x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF);
            i++;
        }
 
        /* Encode output as utf-8 */
        if(x <= 0x7F)
            output += String.fromCharCode(x);
        else if(x <= 0x7FF)
            output += String.fromCharCode(0xC0 | ((x >>> 6 ) & 0x1F),
                0x80 | ( x         & 0x3F));
        else if(x <= 0xFFFF)
            output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F),
                0x80 | ((x >>> 6 ) & 0x3F),
                0x80 | ( x         & 0x3F));
        else if(x <= 0x1FFFFF)
            output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07),
                0x80 | ((x >>> 12) & 0x3F),
                0x80 | ((x >>> 6 ) & 0x3F),
                0x80 | ( x         & 0x3F));
    }
    return output;
}
 
/*
 * Encode a string as utf-16
 */
function str2rstr_utf16le(input)
{
    var output = "";
    for(var i = 0; i < input.length; i++)
        output += String.fromCharCode( input.charCodeAt(i)        & 0xFF,
            (input.charCodeAt(i) >>> 8) & 0xFF);
    return output;
}
 
function str2rstr_utf16be(input)
{
    var output = "";
    for(var i = 0; i < input.length; i++)
        output += String.fromCharCode((input.charCodeAt(i) >>> 8) & 0xFF,
            input.charCodeAt(i)        & 0xFF);
    return output;
}
 
/*
 * Convert a raw string to an array of little-endian words
 * Characters >255 have their high-byte silently ignored.
 */
function rstr2binl(input)
{
    var output = Array(input.length >> 2);
    for(var i = 0; i < output.length; i++)
        output[i] = 0;
    for(var i = 0; i < input.length * 8; i += 8)
        output[i>>5] |= (input.charCodeAt(i / 8) & 0xFF) << (i%32);
    return output;
}
 
/*
 * Convert an array of little-endian words to a string
 */
function binl2rstr(input)
{
    var output = "";
    for(var i = 0; i < input.length * 32; i += 8)
        output += String.fromCharCode((input[i>>5] >>> (i % 32)) & 0xFF);
    return output;
}
 
/*
 * Calculate the MD5 of an array of little-endian words, and a bit length.
 */
function binl_md5(x, len)
{
    /* append padding */
    x[len >> 5] |= 0x80 << ((len) % 32);
    x[(((len + 64) >>> 9) << 4) + 14] = len;
 
    var a =  1732584193;
    var b = -271733879;
    var c = -1732584194;
    var d =  271733878;
 
    for(var i = 0; i < x.length; i += 16)
    {
        var olda = a;
        var oldb = b;
        var oldc = c;
        var oldd = d;
 
        a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936);
        d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586);
        c = md5_ff(c, d, a, b, x[i+ 2], 17,  606105819);
        b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330);
        a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897);
        d = md5_ff(d, a, b, c, x[i+ 5], 12,  1200080426);
        c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341);
        b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983);
        a = md5_ff(a, b, c, d, x[i+ 8], 7 ,  1770035416);
        d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417);
        c = md5_ff(c, d, a, b, x[i+10], 17, -42063);
        b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162);
        a = md5_ff(a, b, c, d, x[i+12], 7 ,  1804603682);
        d = md5_ff(d, a, b, c, x[i+13], 12, -40341101);
        c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290);
        b = md5_ff(b, c, d, a, x[i+15], 22,  1236535329);
 
        a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510);
        d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632);
        c = md5_gg(c, d, a, b, x[i+11], 14,  643717713);
        b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302);
        a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691);
        d = md5_gg(d, a, b, c, x[i+10], 9 ,  38016083);
        c = md5_gg(c, d, a, b, x[i+15], 14, -660478335);
        b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848);
        a = md5_gg(a, b, c, d, x[i+ 9], 5 ,  568446438);
        d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690);
        c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961);
        b = md5_gg(b, c, d, a, x[i+ 8], 20,  1163531501);
        a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467);
        d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784);
        c = md5_gg(c, d, a, b, x[i+ 7], 14,  1735328473);
        b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734);
 
        a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558);
        d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463);
        c = md5_hh(c, d, a, b, x[i+11], 16,  1839030562);
        b = md5_hh(b, c, d, a, x[i+14], 23, -35309556);
        a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060);
        d = md5_hh(d, a, b, c, x[i+ 4], 11,  1272893353);
        c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632);
        b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640);
        a = md5_hh(a, b, c, d, x[i+13], 4 ,  681279174);
        d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222);
        c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979);
        b = md5_hh(b, c, d, a, x[i+ 6], 23,  76029189);
        a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487);
        d = md5_hh(d, a, b, c, x[i+12], 11, -421815835);
        c = md5_hh(c, d, a, b, x[i+15], 16,  530742520);
        b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651);
 
        a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844);
        d = md5_ii(d, a, b, c, x[i+ 7], 10,  1126891415);
        c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905);
        b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055);
        a = md5_ii(a, b, c, d, x[i+12], 6 ,  1700485571);
        d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606);
        c = md5_ii(c, d, a, b, x[i+10], 15, -1051523);
        b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799);
        a = md5_ii(a, b, c, d, x[i+ 8], 6 ,  1873313359);
        d = md5_ii(d, a, b, c, x[i+15], 10, -30611744);
        c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380);
        b = md5_ii(b, c, d, a, x[i+13], 21,  1309151649);
        a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070);
        d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379);
        c = md5_ii(c, d, a, b, x[i+ 2], 15,  718787259);
        b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551);
 
        a = safe_add(a, olda);
        b = safe_add(b, oldb);
        c = safe_add(c, oldc);
        d = safe_add(d, oldd);
    }
    return Array(a, b, c, d);
}
 
/*
 * These functions implement the four basic operations the algorithm uses.
 */
function md5_cmn(q, a, b, x, s, t)
{
    return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b);
}
function md5_ff(a, b, c, d, x, s, t)
{
    return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
}
function md5_gg(a, b, c, d, x, s, t)
{
    return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
}
function md5_hh(a, b, c, d, x, s, t)
{
    return md5_cmn(b ^ c ^ d, a, b, x, s, t);
}
function md5_ii(a, b, c, d, x, s, t)
{
    return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
}
 
/*
 * Add integers, wrapping at 2^32. This uses 16-bit operations internally
 * to work around bugs in some JS interpreters.
 */
function safe_add(x, y)
{
    var lsw = (x & 0xFFFF) + (y & 0xFFFF);
    var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
    return (msw << 16) | (lsw & 0xFFFF);
}
 
/*
 * Bitwise rotate a 32-bit number to the left.
 */
function bit_rol(num, cnt)
{
    return (num << cnt) | (num >>> (32 - cnt));
}

js base64:

/*
 * $Id: base64.js,v 2.12 2013/05/06 07:54:20 dankogai Exp dankogai $
 *
 *  Licensed under the MIT license.
 *    http://opensource.org/licenses/mit-license
 *
 *  References:
 *    http://en.wikipedia.org/wiki/Base64
 */
 
(function(global) {
    'use strict';
    // existing version for noConflict()
    var _Base64 = global.Base64;
    var version = "2.1.4";
    // if node.js, we use Buffer
    var buffer;
    if (typeof module !== 'undefined' && module.exports) {
        buffer = require('buffer').Buffer;
    }
    // constants
    var b64chars
    = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
    var b64tab = function(bin) {
        var t = {};
        for (var i = 0, l = bin.length; i < l; i++) t[bin.charAt(i)] = i;
        return t;
    }(b64chars);
    var fromCharCode = String.fromCharCode;
    // encoder stuff
    var cb_utob = function(c) {
        if (c.length < 2) {
            var cc = c.charCodeAt(0);
            return cc < 0x80 ? c
            : cc < 0x800 ? (fromCharCode(0xc0 | (cc >>> 6))
                + fromCharCode(0x80 | (cc & 0x3f)))
            : (fromCharCode(0xe0 | ((cc >>> 12) & 0x0f))
                + fromCharCode(0x80 | ((cc >>>  6) & 0x3f))
                + fromCharCode(0x80 | ( cc         & 0x3f)));
        } else {
            var cc = 0x10000
            + (c.charCodeAt(0) - 0xD800) * 0x400
            + (c.charCodeAt(1) - 0xDC00);
            return (fromCharCode(0xf0 | ((cc >>> 18) & 0x07))
                + fromCharCode(0x80 | ((cc >>> 12) & 0x3f))
                + fromCharCode(0x80 | ((cc >>>  6) & 0x3f))
                + fromCharCode(0x80 | ( cc         & 0x3f)));
        }
    };
    var re_utob = /[\uD800-\uDBFF][\uDC00-\uDFFFF]|[^\x00-\x7F]/g;
    var utob = function(u) {
        return u.replace(re_utob, cb_utob);
    };
    var cb_encode = function(ccc) {
        var padlen = [0, 2, 1][ccc.length % 3],
        ord = ccc.charCodeAt(0) << 16
        | ((ccc.length > 1 ? ccc.charCodeAt(1) : 0) << 8)
        | ((ccc.length > 2 ? ccc.charCodeAt(2) : 0)),
        chars = [
        b64chars.charAt( ord >>> 18),
        b64chars.charAt((ord >>> 12) & 63),
        padlen >= 2 ? '=' : b64chars.charAt((ord >>> 6) & 63),
        padlen >= 1 ? '=' : b64chars.charAt(ord & 63)
        ];
        return chars.join('');
    };
    var btoa = global.btoa ? function(b) {
        return global.btoa(b);
    } : function(b) {
        return b.replace(/[\s\S]{1,3}/g, cb_encode);
    };
    var _encode = buffer
    ? function (u) {
        return (new buffer(u)).toString('base64')
    } 
    : function (u) {
        return btoa(utob(u))
    }
    ;
    var encode = function(u, urisafe) {
        return !urisafe 
        ? _encode(u)
        : _encode(u).replace(/[+\/]/g, function(m0) {
            return m0 == '+' ? '-' : '_';
        }).replace(/=/g, '');
    };
    var encodeURI = function(u) {
        return encode(u, true)
    };
    // decoder stuff
    var re_btou = new RegExp([
        '[\xC0-\xDF][\x80-\xBF]',
        '[\xE0-\xEF][\x80-\xBF]{2}',
        '[\xF0-\xF7][\x80-\xBF]{3}'
        ].join('|'), 'g');
    var cb_btou = function(cccc) {
        switch(cccc.length) {
            case 4:
                var cp = ((0x07 & cccc.charCodeAt(0)) << 18)
                |    ((0x3f & cccc.charCodeAt(1)) << 12)
                |    ((0x3f & cccc.charCodeAt(2)) <<  6)
                |     (0x3f & cccc.charCodeAt(3)),
                offset = cp - 0x10000;
                return (fromCharCode((offset  >>> 10) + 0xD800)
                    + fromCharCode((offset & 0x3FF) + 0xDC00));
            case 3:
                return fromCharCode(
                    ((0x0f & cccc.charCodeAt(0)) << 12)
                    | ((0x3f & cccc.charCodeAt(1)) << 6)
                    |  (0x3f & cccc.charCodeAt(2))
                    );
            default:
                return  fromCharCode(
                    ((0x1f & cccc.charCodeAt(0)) << 6)
                    |  (0x3f & cccc.charCodeAt(1))
                    );
        }
    };
    var btou = function(b) {
        return b.replace(re_btou, cb_btou);
    };
    var cb_decode = function(cccc) {
        var len = cccc.length,
        padlen = len % 4,
        n = (len > 0 ? b64tab[cccc.charAt(0)] << 18 : 0)
        | (len > 1 ? b64tab[cccc.charAt(1)] << 12 : 0)
        | (len > 2 ? b64tab[cccc.charAt(2)] <<  6 : 0)
        | (len > 3 ? b64tab[cccc.charAt(3)]       : 0),
        chars = [
        fromCharCode( n >>> 16),
        fromCharCode((n >>>  8) & 0xff),
        fromCharCode( n         & 0xff)
        ];
        chars.length -= [0, 0, 2, 1][padlen];
        return chars.join('');
    };
    var atob = global.atob ? function(a) {
        return global.atob(a);
    } : function(a){
        return a.replace(/[\s\S]{1,4}/g, cb_decode);
    };
    var _decode = buffer
    ? function(a) {
        return (new buffer(a, 'base64')).toString()
    }
    : function(a) {
        return btou(atob(a))
    };
    var decode = function(a){
        return _decode(
            a.replace(/[-_]/g, function(m0) {
                return m0 == '-' ? '+' : '/'
            })
            .replace(/[^A-Za-z0-9\+\/]/g, '')
            );
    };
    var noConflict = function() {
        var Base64 = global.Base64;
        global.Base64 = _Base64;
        return Base64;
    };
    // export Base64
    global.Base64 = {
        VERSION: version,
        atob: atob,
        btoa: btoa,
        fromBase64: decode,
        toBase64: encode,
        utob: utob,
        encode: encode,
        encodeURI: encodeURI,
        btou: btou,
        decode: decode,
        noConflict: noConflict
    };
    // if ES5 is available, make Base64.extendString() available
    if (typeof Object.defineProperty === 'function') {
        var noEnum = function(v){
            return {
                value:v,
                enumerable:false,
                writable:true,
                configurable:true
            };
        };
        global.Base64.extendString = function () {
            Object.defineProperty(
                String.prototype, 'fromBase64', noEnum(function () {
                    return decode(this)
                }));
            Object.defineProperty(
                String.prototype, 'toBase64', noEnum(function (urisafe) {
                    return encode(this, urisafe)
                }));
            Object.defineProperty(
                String.prototype, 'toBase64URI', noEnum(function () {
                    return encode(this, true)
                }));
        };
    }
// that's it!
})(this);

正则表达式

用于正则表达式的通配符:
 
\d   匹配数字0-9
 
\D   匹配任何非数字字符
 
\w   匹配单词字符, 包括大小写字母a-z, 
 
A-Z, 数字0-9和下划线_
 
\W   匹配任何非单词字符
 
\s   匹配任何空白字符, 包括空格 制表符 
 
换页符(即匹配\n \r \v \f 以及空格)
 
\S   匹配任何非空白字符
 
.    匹配除换行符(\n)之外的任何字符
 
 
可选字符集     [] 
 
[abc]    表示该位置可以出现字母a b c
 
[A-D]    表示该位置可以出现字母A B C D
 
[A-DM-P] 表示该位置可以出现字母A到D或M
 
到P
 
[12]     表示该位置可以出现数字12
 
[1-5]    表示该位置可以出现数字15
 
[0-57-9] 表示该位置可以出现除6以外的所
 
有数字
 
[\s\S]   表示该位置可以出现任何字符, 
 
包括任何可见字符和不可见字符
 
反向字符集  ^
 
[^x]    匹配除x以外的所有字符
 
[^abc]  匹配除a b c 以外的所有字符
 
[^0-9]  匹配除0-9以外的所有字符
 
[^#]    匹配除#以外的所有字符

[^\n]   匹配除换行符\n以外的所有字符
 
 
或匹配    |
 
"x|y"       匹配"x""y"
"(tr|b)ee"  匹配tree或bee
 
 
数量限定符  *  +  {}  ?
 
*      将前面的字符重复0或多次
 
+      将前面的字符重复1或多次
 
?      将前面的字符重复01次
 
{n}    将前面的字符重复n次
 
{n,}   将前面的字符至少重复n次
 
{n,m}  将前面的字符重复n至m次
 
*?     将前面的字符重复0或多次, 尽量少
 
重复
 
+?     将前面的字符重复1或多次, 尽量少
 
重复
 
??     将前面的字符重复01, 尽量少
 
重复
 
{n}?   将前面的字符重复n次, 尽量少重复
 
{n,}?  将前面的字符至少重复n次, 尽量少
 
重复
 
{n,m}? 将前面的字符重复n至m次, 尽量少
 
重复
 
 
定位符: ^   &   \b
 
^   匹配字符串的开头位置
 
&   匹配字符串的结尾位置
 
\b  匹配单词的边界位置
 
\B  匹配不是单词的边界位置
 
\G  匹配上一个匹配结果的位置
 
\A  匹配字符串开头位置, 类似^
 
\Z  匹配字符串结尾位置或换行符所在的位
 
置
 
\z  匹配字符串结尾位置, 类似&
 
 
分组  ():
asdfgas@qq.com
可以通过下面的正则表达式来匹配,
"(\w+)@(\w+)\.(\w+)"
()将上面的正则表达式分成3组
下面的正则表达式有5, 最外面的括弧为
 
第一组,最里面的括弧为第四和第五组
"( ( ) ( ( ) ( ) ) )"
 
 
非捕获分组 ?:
正向预查   ?=
反向预查   ?<=
负正向预查 ?!
负反向预查 ?<!

PHP判断当前时间是否在特定的时间范围内

网站投票系统可能会用到:

 $week = date("w");
        if ($week == 1) {//说明当天 是星期一
            $this->ajaxReturn(0, '只有每周二下午14:00 到 周日晚上23:59才可以投票哦', 0);
        }
        if ($week == 2) {//当前是星期二 
            $start_time = "14:00";
            if (date('H:i') < $start_time) {
                $this->ajaxReturn(0, '只有每周二下午14:00 到 周日晚上23:59才可以投票哦', 0);
            }
        }

yii中gii自动生成的curd添加批量删除功能

1.在视图中 CGridView中的columns添加,作用是添加多选框

array(
       'selectableRows' => 2,
       'footer' => '<button type="button" onclick="GetCheckbox();" style="width:76px">批量删除</button>',
       'class' => 'CCheckBoxColumn',
       'headerHtmlOptions' => array('width' => '33px'),
       'checkBoxHtmlOptions' => array('name' => 'selectdel[]'),
     ),

2.引入js代码

function GetCheckbox(){
            var data=new Array();
            $("input:checkbox[name='selectdel[]']").each(function (){
                    if($(this).attr("checked")==true){
                            data.push($(this).val());
                    }
            });
            if(data.length > 0){
                    $.post("index.php?r=member/my_cart/delall",{'selectdel[]':data}, function (data) {
                            if (data=='ok') {
                                    alert('删除成功!');
          location.href = "index.php?r=member/my_cart/admin";
                          }
                    });
            }else{
                    alert("请选择要删除的选项!");
            }
    }

3.Action中

 public function actionDelall() {
        if (Yii::app()->request->isPostRequest) {
            $criteria = new CDbCriteria;
            $criteria->addInCondition('rec_id', $_POST['selectdel']);
            Cartdb::model()->deleteAll($criteria); 
            if (isset(Yii::app()->request->isAjaxRequest)) {
                echo 'ok';
            }
            else
                $this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('index'));
        }
        else
            throw new CHttpException(400, 'Invalid request. Please do not repeat this request again.');
    }

php 读取目录中的图片

<?php
 
function file_list($path) {
    $allowed_types = array('jpg', 'jpeg', 'gif', 'png');
    if ($handle = opendir($path)) {//打开路径成功
        while (false !== ($file = readdir($handle))) {//循环读取目录中的文件名并赋值给$file
            if ($file != "." && $file != "..") {//排除当前路径和前一路径
                if (is_dir($path . "/" . $file)) {
//                    echo $path.": ".$file."<br>";//去掉此行显示的是所有的非目录文件
                    file_list($path . "/" . $file);
                } else {
                    $file_parts = explode('.', $file);
                    $ext = strtolower(array_pop($file_parts));
                    $title = implode('.', $file_parts);
                    $title = htmlspecialchars($title);
                    if (in_array($ext, $allowed_types) && $title == "screenshot") {
                        echo $path . ": " . $file . "<br>";
                        echo "<img src='{$path}/{$file}'  border='0' />";
                    }
                }
            }
        }
    }
}
 
file_list('themes');

PHP用curl伪造IP和来源

CURL伪造IP和来源

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://localhost/2.php");
curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-FORWARDED-FOR:8.8.8.8', 'CLIENT-IP:8.8.8.8'));  //构造IP
curl_setopt($ch, CURLOPT_REFERER, "http://www.gosoa.com.cn/ ");   //构造来路
curl_setopt($ch, CURLOPT_HEADER, 1);
$out = curl_exec($ch);
curl_close($ch);
function getClientIp() {
    if (!empty($_SERVER["HTTP_CLIENT_IP"]))
        $ip = $_SERVER["HTTP_CLIENT_IP"];
    else if (!empty($_SERVER["HTTP_X_FORWARDED_FOR"]))
        $ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
    else if (!empty($_SERVER["REMOTE_ADDR"]))
        $ip = $_SERVER["REMOTE_ADDR"];
    else
        $ip = "err";
    return $ip;
}
 
echo "IP: " . getClientIp() . "";
echo "referer: " . $_SERVER["HTTP_REFERER"];

PHP CURL 上传图片

客户端:

<?php
header('Content-Type:text/html;charset=utf-8');
$file = realpath('sample.jpeg'); //要上传的文件
$fields['file'] = '@' . $file;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "img.t.com");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
 
curl_exec($ch);
curl_close($ch);
die;

服务器端:

<?php
//print_r($_FILES);
move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);
echo "上传成功,图片保存在: " . "upload/" . $_FILES["file"]["name"];
die;

PHP 5.5 正式版发布,不再支持 Windows XP

PHP 开发者正式 发布 5.5 版本,该版本从去年11月开始开发,历经多个测试版本。PHP 5.5 包含一系列的新特性,例如新的 array_column() 函数以及 foreach() 循环支持标量迭代键;包括 generators 允许开发者实现简单的协程。

同时新版本引入了一个密码哈希函数,可以让开发者轻松实现加盐的安全密码;新增 finally 关键字;foreach 结构支持 list() 构建;其他改进包括 opcode 缓存、代码优化、Zend Optimizer+ 等等,这些对不会对已有代码造成影响,主要是提升语言的性能和稳定性。

新的密码哈希 API 使用了 Bcrypt 方法,示例如下:

$hash = password_hash($password, PASSWORD_DEFAULT);

校验方法:

password_verify($password, $hash);

同时 PHP 开发者也提醒用户,PHP 5.5 也包含一些不向后兼容的内容,包括:不再支持 Windows XP 和 2003 系统;不区分大小写的匹配函数、类;常数名称跟 Locale 无关,这对一些使用非 ASCII 代码的常量名的开发者需要注意的。完整的关于 PHP 5.5 不向后兼容列表请看 list of new features and possible incompatibilities
PHP 5.5 的完整改进记录请看 NEWS file
下载地址:
http://windows.php.net/qa/ (Windows)
http://php.net/downloads.php#v5 (源码包)

PHP SoapServer XML实例代码

clent.php:

$client = new SoapClient(null, array('location' => "http://demo.test.com/wsdl/HelloWorldService.php?wsdl", 'uri' => 'http://test-uri/'));
try {
    $result = $client->outsider();
    var_dump($result);
    echo "The answer isresult";
} catch (SoapFault $f) {
    echo "Error Message: {$f->getMessage()}";
}

HellowWordServer.php:

require_once 'HelloWorld.class.php';
if (isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] == 'POST') {
    $servidorSoap = new SoapServer('http://' . $_SERVER['SERVER_NAME'] . ':' . $_SERVER['SERVER_PORT'] . $_SERVER['PHP_SELF'] . '?wsdl');
    $servidorSoap->setClass('HelloWorld');
    $servidorSoap->handle();
} else {
    require_once 'SoapDiscovery.class.php';
 
    // Crea el servidor de descubrimiento
    $disco = new SoapDiscovery('HelloWorld', 'Solsoft_HelloWorld');
    header("Content-type: text/xml");
    if (isset($_SERVER['QUERY_STRING']) && strcasecmp($_SERVER['QUERY_STRING'], 'wsdl') == 0) {
        echo $disco->getWSDL();
    } else {
        echo $disco->getDiscovery();
    }
}

HelloWorld.class.php

class HelloWorld {
	private $nombre = '';
 
	/**
	 * HelloWorld::__construct() HelloWorld class Constructor.
	 * 
	 * @param string $nombre
	 * @return string
	 **/
	public function __construct($name = 'World') {
		$this->name = $name;
	}
 
	/**
	 * HelloWorld::greet() Greets the World xor $this->name xor $name if $name is not empty.
	 * 
	 * @param string $nombre
	 * @return string
	 **/
	public function greet($name = '') {
		$name = $name?$name:$this->name;
		return 'Hello '.$name.'.';
	}
 
	/**
	 * HelloWorld::servidorEstampillaDeTiempo() Returns server timestamp.
	 * 
	 * @return string 
	 **/
	public function serverTimestamp() {
		return time();
	} 
        public function outsider(){
            return "OUTSIDER";
        }
}

HelloWorld.wsdl

<?xml version="1.0" ?>
<definitions name="Solsoft_HelloWorld" targetNamespace="urn:Solsoft_HelloWorld" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="urn:Solsoft_HelloWorld" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns="http://schemas.xmlsoap.org/wsdl/">
<types xmlns="http://schemas.xmlsoap.org/wsdl/" />
<portType name="Solsoft_HelloWorldPort"><operation name="greet">
<input message="tns:greetRequest" />
<output message="tns:greetResponse" />
</operation>
<operation name="serverTimestamp">
<input message="tns:serverTimestampRequest" />
<output message="tns:serverTimestampResponse" />
</operation>
<operation name="outsider">
<input message="tns:outsiderRequest" />
<output message="tns:outsiderResponse" />
</operation>
</portType>
<binding name="Solsoft_HelloWorldBinding" type="tns:Solsoft_HelloWorldPort">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" />
<operation name="greet">
<soap:operation soapAction="urn:Solsoft_HelloWorld#HelloWorld#greet" />
<input><soap:body use="encoded" namespace="urn:Solsoft_HelloWorld" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
</input>
<output>
<soap:body use="encoded" namespace="urn:Solsoft_HelloWorld" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
</output>
</operation>
<operation name="serverTimestamp">
<soap:operation soapAction="urn:Solsoft_HelloWorld#HelloWorld#serverTimestamp" />
<input><soap:body use="encoded" namespace="urn:Solsoft_HelloWorld" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
</input>
<output>
<soap:body use="encoded" namespace="urn:Solsoft_HelloWorld" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
</output>
</operation>
<operation name="outsider">
<soap:operation soapAction="urn:Solsoft_HelloWorld#HelloWorld#outsider" />
<input><soap:body use="encoded" namespace="urn:Solsoft_HelloWorld" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
</input>
<output>
<soap:body use="encoded" namespace="urn:Solsoft_HelloWorld" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
</output>
</operation>
</binding>
<service name="Solsoft_HelloWorld">
<documentation />
<port name="Solsoft_HelloWorldPort" binding="tns:Solsoft_HelloWorldBinding"><soap:address location="http://demo.test.com:80/wsdl/HelloWorldService.php" />
</port>
</service>
<message name="greetRequest">
<part name="name" type="xsd:string" />
</message>
<message name="greetResponse">
<part name="greet" type="xsd:string" />
</message>
<message name="serverTimestampRequest">
</message>
<message name="serverTimestampResponse">
<part name="serverTimestamp" type="xsd:string" />
</message>
<message name="outsiderRequest">
</message>
<message name="outsiderResponse">
<part name="outsider" type="xsd:string" />
</message>
</definitions>

SoapDiscovery.class.php

class SoapDiscovery {
	private $class_name = '';
	private $service_name = '';
 
	/**
	 * SoapDiscovery::__construct() SoapDiscovery class Constructor.
	 * 
	 * @param string $class_name
	 * @param string $service_name
	 **/
	public function __construct($class_name = '', $service_name = '') {
		$this->class_name = $class_name;
		$this->service_name = $service_name;
	}
 
	/**
	 * SoapDiscovery::getWSDL() Returns the WSDL of a class if the class is instantiable.
	 * 
	 * @return string
	 **/
	public function getWSDL() {
		if (empty($this->service_name)) {
			throw new Exception('No service name.');
		}
		$headerWSDL = "<?xml version=\"1.0\" ?>\n";
		$headerWSDL.= "<definitions name=\"$this->service_name\" targetNamespace=\"urn:$this->service_name\" xmlns:wsdl=\"http://schemas.xmlsoap.org/wsdl/\" xmlns:soap=\"http://schemas.xmlsoap.org/wsdl/soap/\" xmlns:tns=\"urn:$this->service_name\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:SOAP-ENC=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns=\"http://schemas.xmlsoap.org/wsdl/\">\n";
		$headerWSDL.= "<types xmlns=\"http://schemas.xmlsoap.org/wsdl/\" />\n";
 
		if (empty($this->class_name)) {
			throw new Exception('No class name.');
		}
 
		$class = new ReflectionClass($this->class_name);
 
		if (!$class->isInstantiable()) {
			throw new Exception('Class is not instantiable.');
		}
 
		$methods = $class->getMethods();
 
		$portTypeWSDL = '<portType name="'.$this->service_name.'Port">';
		$bindingWSDL = '<binding name="'.$this->service_name.'Binding" type="tns:'.$this->service_name."Port\">\n<soap:binding style=\"rpc\" transport=\"http://schemas.xmlsoap.org/soap/http\" />\n";
		$serviceWSDL = '<service name="'.$this->service_name."\">\n<documentation />\n<port name=\"".$this->service_name.'Port" binding="tns:'.$this->service_name."Binding\"><soap:address location=\"http://".$_SERVER['SERVER_NAME'].':'.$_SERVER['SERVER_PORT'].$_SERVER['PHP_SELF']."\" />\n</port>\n</service>\n";
		$messageWSDL = '';
		foreach ($methods as $method) {
			if ($method->isPublic() && !$method->isConstructor()) {
				$portTypeWSDL.= '<operation name="'.$method->getName()."\">\n".'<input message="tns:'.$method->getName()."Request\" />\n<output message=\"tns:".$method->getName()."Response\" />\n</operation>\n";
				$bindingWSDL.= '<operation name="'.$method->getName()."\">\n".'<soap:operation soapAction="urn:'.$this->service_name.'#'.$this->class_name.'#'.$method->getName()."\" />\n<input><soap:body use=\"encoded\" namespace=\"urn:$this->service_name\" encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" />\n</input>\n<output>\n<soap:body use=\"encoded\" namespace=\"urn:$this->service_name\" encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" />\n</output>\n</operation>\n";
			    $messageWSDL.= '<message name="'.$method->getName()."Request\">\n";
				$parameters = $method->getParameters();
				foreach ($parameters as $parameter) {
					$messageWSDL.= '<part name="'.$parameter->getName()."\" type=\"xsd:string\" />\n";
				}
				$messageWSDL.= "</message>\n";
				$messageWSDL.= '<message name="'.$method->getName()."Response\">\n";
				$messageWSDL.= '<part name="'.$method->getName()."\" type=\"xsd:string\" />\n";
				$messageWSDL.= "</message>\n";
			}
		}
		$portTypeWSDL.= "</portType>\n";
		$bindingWSDL.= "</binding>\n";
		return sprintf('%s%s%s%s%s%s', $headerWSDL, $portTypeWSDL, $bindingWSDL, $serviceWSDL, $messageWSDL, '</definitions>'); 
//生成wsdl文件,将上面的return注释 
//$fso = fopen($this->class_name . ".wsdl" , "w"); 
//fwrite($fso, sprintf('%s%s%s%s%s%s', $headerWSDL, $portTypeWSDL, $bindingWSDL, $serviceWSDL, $messageWSDL, '</definitions>')); 
exit; 
	}
 
	/**
	 * SoapDiscovery::getDiscovery() Returns discovery of WSDL.
	 * 
	 * @return string
	 **/
	public function getDiscovery() {
		return "<?xml version=\"1.0\" ?>\n<disco:discovery xmlns:disco=\"http://schemas.xmlsoap.org/disco/\" xmlns:scl=\"http://schemas.xmlsoap.org/disco/scl/\">\n<scl:contractRef ref=\"http://".$_SERVER['SERVER_NAME'].':'.$_SERVER['SERVER_PORT'].$_SERVER['PHP_SELF']."?wsdl\" />\n</disco:discovery>";
	}
}

PHP简单图片采集

第一步先生成一个要采集的TEST文本文件

<?php
 
header('Content-type: text/html;charset=UTF-8');
/**
 * 生成要采集的图片URL地址
 */
$url = "http://outsiderla.me/nikita-creative-staff.html";
// 1. 初始化
$ch = curl_init();
// 2. 设置选项,包括URL
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
// 3. 执行并获取HTML文档内
$con = curl_exec($ch);
// 4. 释放curl句柄
curl_close($ch);
//正则匹配图片
preg_match_all("/<img.*?src=\"(.*?)\".*?\/>/i", $con, $arr);
foreach ($arr[1] as $k => $v) {
//    $file = fopen("img.txt", 'w');
//    fwrite($file, $v);
//    fclose($file);
    file_put_contents('img.txt',"$v \r\n", FILE_APPEND);
}

下载生成上步中生成URL图片链接地址:

<?php
header('Content-type: text/html;charset=UTF-8');
set_time_limit(0);
 
/**
 * 写文件
 * @param    string  $file   文件路径
 * @param    string  $str    写入内容
 * @param    char    $mode   写入模式
 */
function wfile($file, $str, $mode='w') {
    $oldmask = @umask(0);
    $fp = @fopen($file, $mode);
    @flock($fp, 3);
    if (!$fp) {
        Return false;
    } else {
        @fwrite($fp, $str);
        @fclose($fp);
        @umask($oldmask);
        Return true;
    }
}
 
function savetofile($path_get, $path_save) {
    @$hdl_read = fopen($path_get, 'rb');
    if ($hdl_read == false) {
        echo("<span style='color:red'>$path_get can not get</span>");
        Return;
    }
    if ($hdl_read) {
        @$hdl_write = fopen($path_save, 'wb');
        if ($hdl_write) {
            while (!feof($hdl_read)) {
                fwrite($hdl_write, fread($hdl_read, 8192));
            }
            fclose($hdl_write);
            fclose($hdl_read);
            return 1;
        }
        else
            return 0;
    }
    else
        return -1;
}
 
function getExt($path) {
    $path = pathinfo($path);
    return strtolower($path['extension']);
}
 
/**
 * 按指定路径生成目录
 *
 * @param    string     $path    路径
 */
function mkDirs($path) {
    $adir = explode('/', $path);
    $dirlist = '';
    $rootdir = array_shift($adir);
    if (($rootdir != '.' || $rootdir != '..') && !file_exists($rootdir)) {
        @mkdir($rootdir);
    }
    foreach ($adir as $key => $val) {
        if ($val != '.' && $val != '..') {
            $dirlist .= "/" . $val;
            $dirpath = $rootdir . $dirlist;
            if (!file_exists($dirpath)) {
                @mkdir($dirpath);
                @chmod($dirpath, 0777);
            }
        }
    }
}
 
/**
 * 从文本中取得一维数组
 *
 * @param    string     $file_path    文本路径
 */
function getFileListData($file_path) {
    $arr = @file($file_path);
    $data = array();
    if (is_array($arr) && !empty($arr)) {
        foreach ($arr as $val) {
            $item = trim($val);
            if (!empty($item)) {
                $data[] = $item;
            }
        }
    }
    Return $data;
}
 
//采集开始
//传入自己的需要采集的图片url列表文本文件 每个图片url写一行
$url_file = isset($_GET['file']) && !empty($_GET['file']) ? $_GET['file'] : null;
$txt_url = "txt/" . $url_file;
 
$urls = array_unique(getFileListData($txt_url));
if (empty($urls)) {
    echo('<div style="color:red">无链接地址</div>');
    die();
}
$save_url = "images/" . date("y_m_d", time()) . "/";
mkDirs($save_url);  //按日期建立文件夹
$i = 1;
if (is_array($urls) && count($urls)) {
    foreach ($urls as $val) {
        savetofile($val, $save_url . date("His", time()) . "_" . $i . "." . getExt($val));
        echo($i . "." . getExt($val) . " got\n");
        $i++;
    }
}
echo('<div style="color:green">finish</div>');
?>