PHP面试题之代码设计类

1、创建多级目录函数

PHP面试题之代码设计类

1、创建多级目录函数

/**
 * 创建多级目录
 * @param $path string 要创建的目录
 * @param $mode int 创建目录的模式,在windows下可忽略
 */
function create_dir($path,$mode = 0777)
{
    if (is_dir($path)) {
        # 如果目录已经存在,则不创建
        echo "该目录已经存在";
    } else {
        # 不存在,创建
        if (mkdir($path,$mode,true)) {
            echo "创建目录成功";
        } else {
            echo "创建目录失败";
        }
    }
}

2、写出smarty模板的特点

速度快、编译型、缓存技术、插件机制、强大的表现逻辑

3、确保多个进程同时写入同一文件成功

核心思路:加锁

function writeToFile($path, $content){
    $fp = fopen($path, "w+");
    if (flock($fp, LOCK_EX)) {
        //获得写锁,写数据
        fwrite($fp, $content);
        // 解除锁定
        flock($fp, LOCK_UN);
    } else {
        echo "file is locking...";
    }
    fclose($fp);
}

4、尽可能高效的从一个标准url里取出文件的扩展名

eg:http://www.sina.com.cn/abc/de/fg.php?id=1
取出php或.php
// 方案一
function getExtension1($url){
    $arr = parse_url($url);
    //Array ( [scheme] => http [host] => www.sina.com.cn [path] => /abc/de/fg.php [query] => id=1 )
    $file = basename($arr['path']);
    $ext = explode('.', $file);
    return $ext[count($ext)-1];
}
// 方案二
function getExtension2($url){
    $url = basename($url);
    $pos1 = strpos($url, '.');
    $pos2 = strpos($url, '?');
    if (strstr($url, '?')) {
        return substr($url, $pos1 + 1, $pos2 - $pos1 - 1);
    } else {
        return substr($url, $pos1);
    }
}

相关题目:使用五种以上方式获取一个文件的扩展名,要求:dir/upload.image.jpg,找出.jpg或者jpg,必须使用PHP自带的处理函数进行处理,方法不能明显重复,可以封装成函数,比如getExtension1(file_name)

5、遍历一个文件夹下的所有文件和子文件夹

function my_scandir($dir){
    $files = array();
    if(is_dir($dir)){
        if ($handle = opendir($dir)) {
            while (($flie = readdir($handle)) !== false) {
                if ($flie != "." && $file != "..") {
                    if (is_dir($dir . "/" . $file)) {
                        $files[$file] = my_scandir($dir . "/" . $file);
                    } else {
                        $files[] = $dir . "/" . $file;
                    }
                }
            }
            closedir($handle);
            return $files;
        }
    }
}

6、无限极分类实现

相关数据表

CREATE TABLE category(
    cat_id smallint unsigned not null auto_increment primary key comment'类别ID',
    cat_name VARCHAR(30)NOT NULL DEFAULT''COMMENT'类别名称',
    parent_id SMALLINT UNSIGNED NOT NULL DEFAULT 0 COMMENT'类别父ID'
)engine=MyISAM charset=utf8;

程序实现,递归遍历

function tree($arr, $pid = 0, $level = 0){
    static $list = array();
    foreach ($arr as $v) {
        //如果是顶级分类,则将其存到$list中,并以此节点为根节点,遍历其子节点
        if ($v['parent_id'] == $pid) {
            $v['level'] = $level;
            $list[] = $v;
            tree($arr, $v['cat_id'], $level + 1);
        }
    }
    return $list;
}

7、正则表达式过滤网页上所有的js/vbs脚本

header("content-type:text/html;charset=utf-8");
$script = "以下内容不显示:<script type='text/javascript'>alert('cc');</script>";
$pattern = '"<script[^>]*?>.*?</script>"si';
echo preg_replace($pattern, "脚本内容", $script);//以下内容不显示:脚本内容

8、用正则表达式除去文本内容中所有的HTML标记

方案一,使用PHP内建函数strip_tags()除去HTML标签

方案二:

header("content-type:text/html;charset=utf-8");
function strip_html_tags($str){
    $pattern = '/<("[^"]*"|\'[^\']\*\'|[^>"\'])*>/';
    return preg_replace($pattern,'',$str);
}

// 实例
$html = '<p id="">ddddd<br /></p>';
echo strip_html_tags($html);
echo "<br />";

$html = '<p id=">">bb<br />aaa<br /></p>';
echo strip_html_tags($html);

9、使用正则表达式提取html或xml代码中指定标签的指定属性值(需考虑属性值对不规则的情况,如大小写不敏感,属性名值与等号间有空格等)

假设需提取test标签的attr属性值

eg:<test2 attr='ddd'attr2='ddd2't1=\"t1 value\"t2='t2 value'>
header("content-type:text/html;charset=utf-8");
function getAttrValue($str, $tagName, $attrName){
    $pattern1 = "/<".$tagName."(\\s+\\w+\s*=\\s*([\\'\\\"]?)([^\\'\\\"]*)(\\2))*\\s+".$attrName."\\s*=\\s*([\\'\\\"]?)([^\\'\\\"]*)(\\5)(\\s+\\w+\\s*=\\s*([\\'\\\"]?)([^\\'\\\"]*)(\\9))*\\s*>/i";
    $arr = array();
    $re  = preg_match($pattern1, $str, $arr);
    if($re){
        echo"<br/>\$arr[6]={$arr[6]}";
    }else{
        echo"<br/>not found";
    }
}

// 示例
$str1="<test attr = ' ddd'>";
getAttrValue($str1,"test","attr");//找test标签中attr属性的值,结果为ddd

$str2="<test2 attr='ddd' attr2='ddd2' t1=\"t1 value\"t2='t2 value'>";
getAttrValue($str2,"test2","t1");//找test2标签中t1属性的值,结果为t1 value

10、如何判断一个字符串是否是合法的日期格式

function checkDateTime($data){
    if (date('Y-m-d H:i:s',strtotime($data)) == $data) {
        return true;
    } else {
        return false;
    }
}

// 示例
$data = '2015-06-20 13:35:42';
var_dump(checkDateTime($data));//bool(true)

$data = '2015-06-36 13:35:42';
var_dump(checkDateTime($data));//bool(false)

11、取出上个月的最后一天

date_default_timezone_set('PRC');
/**
 * 获取给定月份的上一月最后一天
 * @param $date string 给定日期
 * @return string 上一月最后一天
 */
function get_last_month_last_day($date = ''){
    if ($date != '') {
        $time = strtotime($date);
    } else {
        $time = time();
    }
    $day = date('j', $time);//获取该日期是当前月的第几天
    return date('Y-m-d', strtotime("-{$day} days", $time));
}

// 测试
echo get_last_month_last_day();
echo "<br />";
echo get_last_month_last_day("2013-3-21");

12、将时间变成unix时间戳

date_default_timezone_set("PRC");
// 将字符串转成Unix时间戳
$unix_time = strtotime("2009-9-2 10:30:45");
echo $unix_time;
echo "<br />";
// 格式化Unix时间戳为正常时间格式
echo date("Y-m-d H:i:s",$unix_time);

13、把GB2312格式字符串转换成UTF-8格式

iconv('GB2312', 'UTF-8', '时间');

参考文章:

php面试题之PHP核心技术

上一篇:Nginx解决访问图片显示404,403问题 下一篇:MySQL常见知识点整理

评论

评论(1)

暂无评论