1. 正则
<?php
$a = "<a href='javascript:void(0)'>XS1000010011702130002</a>";
$o = "hello";
echo preg_replace_callback("/\<a.*?\>(.*)\<\/a\>/", function($matches){return str_replace($matches[1],$o,$matches[0]);}, $a);
上面这段代码,是想把a标签的内容换成hello,preg_replace_callback(),第二个参数是个回调函数,这里采用匿名(闭包)函数来代替,否则就传入函数名即可。
回调函数的参数是匹配到结果数组,比如这里var_dump($matches),结果为:
array(2) {
[0]=>
string(129) “<a href=’javascript:void(0)’ data-openwin=’true’ data-winid=” data-url=’/scm/order-detail-11932.html’>XS1000010011702130002</a>”
[1]=>
string(21) “XS1000010011702130002”
}
运行代码发现结果不是预想的那样,报错$o不存在,原来忽视了最基本的作用域问题,于是回调函数里加上global $o,再运行ok。
其实在闭包函数里,还可以用use关键字来使用上文的变量。比如这里可以这么写:
<?php
function($matches) use($o){
//...
}
两种写法都可以。
2. 封装协议
php中有很多封装协议用于url,比如http://,ftp://等等。其中有一个php://,文档中的说明:
说明:PHP 提供了一些杂项输入/输出(IO)流,允许访问 PHP 的输入输出流、标准输入输出和错误描述符, 内存中、磁盘备份的临时文件流以及可以操作其他读取写入文件资源的过滤器。
php://output是将数据写入缓冲区,比如:
<?php
$fp = fopen("php://output","r");
fwirte($fp, "helloworld");
// 运行输出“”helloworld“”
php://input 是个可以访问请求的原始数据的只读流,比如post请求的数据:
<?php
// 假设post的数据 {"name":"laokiea"}
var_dump(file_get_contents("php://input"));\
// result : string(12) "name=laokiea"