$str = '2e33ez869';
$pattern = "/[a-zA-Z]/";
var_dump(preg_replace($pattern,'*', $str));
Q:用PHP实现英文字符串翻转
A:
1)strrev()函数
2)自定义函数
function strrevv($str){
$len=strlen($str);
$newstr = '';
for($i = $len-1; $i >= 0; $i--){
$newstr .= $str{$i};
}
}
Q:写一段PHP代码,确保多个进程同时写入同一个文件(提示:文件锁)
A:
function write_file($filename, $content){
$lock = $filename . '.lck';
$write_length = 0;
while(true) {
if( file_exists($lock) ) {
usleep(100);
} else {
touch($lock);
$write_length = file_put_contents($filename, $content, FILE_APPEND);
break;
}
}
if( file_exists($lock) ) {
unlink($lock);
}
//返回写入结果
return $write_length;
}
Q:在HTTP1.0中,状态码200、301、302、403、404、500、502的含义
A:
200:成功。服务器已成功处理了请求。通常,这表示服务器提供了请求的网页。如果是对您的 robots.txt 文件显示此状态码,则表示 Googlebot 已成功检索到该文件。
301:永久移动。请求的网页已永久移动到新位置。服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。
302:临时移动。服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来响应以后的请求。
403:禁止。服务器拒绝请求。
404:未找到。服务器找不到请求的网页。
500:服务器遇到错误,无法完成请求。
502:错误网关。服务器作为网关或代理,从上游服务器收到无效响应。
Q:写出一个正则表达式,过滤网页上的JS/VBS脚本;写一个正则表达式验证电子邮件的格式
A:
/<script[^>]*?>.*?<\/script>/si
/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((\.[a-zA-Z0-9_-]{2,3}){1,2})$/
Q:用php写一个函数数将一,二,十一,十二,二十二,四十三,一百一十八,七百五十八,一千五十六,一千九百四十二这样的中文数字转换成1,2,11,12,22,43,118,758,1056,1942这样阿拉伯数字,6000以内的能转换就行了。
A:
function abc($str){
$arr = array(
'零'=>0,
'一'=>1,
'二'=>2,
'三'=>3,
'四'=>4,
'五'=>5,
'六'=>6,
'七'=>7,
'八'=>8,
'九'=>9,
'十'=>10,
'百'=>100,
'千'=>1000,
'万'=>10000,
);
$len = mb_strlen($str, 'utf-8');
$res = array();
for($i = 0; $i<$len; $i++){
$single = mb_substr($str, $i, 1, 'utf-8');
$res[] = $arr[$single];
}
$result = 0;
for($i = 0; $i<count($res); $i++){
if ($i == 0 && $res[$i] == 10){
$result += 10;
}else if ($res[$i] > 9 || $res[$i] == 0 ) {
continue;
} else if (isset($res[$i+1]) && $res[$i+1] > 9){
$tmp = $res[$i] * $res[$i+1];
$result += $tmp;
} else {
$result += $res[$i];
}
}
return $result;
}
Q:php面向对象中的魔术方法
A:
__construct() 实例化对象是被自动调用。当__construct和以类名为函数名的函数 同时存在时调用__construct,另一个不背调用。类名为函数名的函数为老版的构造函数。
__destruct() 当删除一个对象或一个对象操作结束是被调用。
__call() 对象调用某个方法。若方法不存在,这调用__call 这个方法
__get() 读取一个对象属性,如果对象属性是私有的会调用它
__set() 给一个对象属性赋值时如果属性是私有的会调用它
__toString() 打印一个对象的时候会被调用。
__clone() 克隆对象时被调用,如:$a=new test(); $a1=clone $a;
__sleep() Serialize 之前被调用,若对象比较大,想删减一点东西在序列化可以用它。
__wakeup() Unserialize时被调用,做些对象的初始化工作。
__isset() 检测一个对象的属性是否存在如果 检测的属性是私有的时候会被调用。
__unset() 删除一个对象属性时如果 删除的对象属性是私有的会被调用
__set_state() 调用var_export时,被调用。用__set_state的返回值做为var_export的返回值。
__autoload() 实例化一个对象时,如果对应的类不存在,则该方法被掉用。
Q:将字符串“2a3E33Z55”中的数字转为星号(*),字母转为小写
A:
$str = '2a3E33Z55';
$pattern = "/\d/";
var_dump(preg_replace($pattern,'*', strtolower($str)));
Q:常见的设计模式
A:
参考自:https://www.ibm.com/developerworks/cn/opensource/os-php-designptrns/
一、工厂模式
工厂模式 是一种类,它具有为您创建对象的某些方法。您可以使用工厂类创建对象,而不直接使用 new。这样,如果您想要更改所创建的对象类型,只需更改该工厂即可。使用该工厂的所有代码会自动更改。
二、单例模式
某些应用程序资源是独占的,因为有且只有一个此类型的资源。例如,通过数据库句柄到数据库的连接是独占的。您希望在应用程序中共享数据库句柄,因为在保持连接打开或关闭时,它是一种开销,在获取单个页面的过程中更是如此。
三、观察者模式
观察者模式为您提供了避免组件之间紧密耦合的另一种方法。该模式非常简单:一个对象通过添加一个方法(该方法允许另一个对象,即观察者 注册自己)使本身变得可观察。当可观察的对象更改时,它会将消息发送到已注册的观察者。这些观察者使用该信息执行的操作与可观察的对象无关。结果是对象可以相互对话,而不必了解原因。
四、命令链模式
命令链 模式以松散耦合主题为基础,发送消息、命令和请求,或通过一组处理程序发送任意内容。每个处理程序都会自行判断自己能否处理请求。如果可以,该请求被处理,进程停止。您可以为系统添加或移除处理程序,而不影响其他处理程序。
五、策略模式
在此模式中,算法是从复杂类提取的,因而可以方便地替换。例如,如果要更改搜索引擎中排列页的方法,则策略模式是一个不错的选择。思考一下搜索引擎的几个部分 —— 一部分遍历页面,一部分对每页排列,另一部分基于排列的结果排序。在复杂的示例中,这些部分都在同一个类中。通过使用策略模式,您可将排列部分放入另一个类中,以便更改页排列的方式,而不影响搜索引擎的其余代码。
Q:快速排序
A:
/*
快速排序
*/
function quickSort($array)
{
if(!isset($array[1]))
return $array;
$mid = $array[0]; //获取一个用于分割的关键字,一般是首个元素
$leftArray = array();
$rightArray = array();
foreach($array as $v)
{
if($v > $mid)
$rightArray[] = $v; //把比$mid大的数放到一个数组里
if($v < $mid)
$leftArray[] = $v; //把比$mid小的数放到另一个数组里
}
$leftArray = quickSort($leftArray); //把比较小的数组再一次进行分割
$leftArray[] = $mid; //把分割的元素加到小的数组后面,不能忘了它哦
$rightArray = quickSort($rightArray); //把比较大的数组再一次进行分割
return array_merge($leftArray,$rightArray); //组合两个结果
}