1. 寫一個函數,儘可能高效的,從一個標準 url 裡取出檔案的副檔名
例如: /abc/de/fg.php?id=1 需要取出 php 或 .php
答:我是直接用PHP內建函數搞定的,不重複造輪子,估計出題者也是想考察基礎知識,主要是解析url和一個返迴文件資訊的函數(擴充:取得檔案尾碼名的多種方法):
代碼如下 |
複製代碼 |
<?php /** by */ $url = "/abc/de/fg.php?id=1"; $path = parse_url($url); echo pathinfo($path['path'],PATHINFO_EXTENSION); //php ?> |
2. 在 HTML 語言中,頁面頭部的 meta 標記可以用來輸出檔案的編碼格式,以下是一個標準的 meta 語句
<META http-equiv='Content-Type' content='text/html; charset=gbk'>
請使用 PHP 語言寫一個函數,把一個標準 HTML 頁面中的類似 meta 標記中的 charset 部分值改為 big5
請注意:
(1) 需要處理完整的 html 頁面,即不光此 meta 語句
(2) 忽略大小寫
(3) ' 和 " 在此處是可以互換的
(4) 'Content-Type' 兩側的引號是可以忽略的,但 'text/html; charset=gbk' 兩側的不行
(5) 注意處理多餘空格
答:表示我Regex(PHP正則詳解)忘記差不多了,弄了半天。
代碼如下 |
複製代碼 |
<?php /** */ $html = "<meta http-equiv='Content-Type' content='text/html; charset=gbk'>"; //匹配標準的meta標籤 $pattern = "/<metas+http-equiv=('|")?Content-Type('|")?s+content=('|")text/html;s+charset=(.*)('|")>/i"; $replacement = "<meta http-equiv='Content-Type' content='text/html; charset=big5'>"; $result = preg_replace($pattern, $replacement, $html); echo htmlspecialchars($result); ?> |
3. 寫一個函數,算出兩個檔案的相對路徑
如 $a = '/a/b/c/d/e.php';
$b = '/a/b/12/34/c.php';
計算出 $b 相對於 $a 的相對路徑應該是 ../../c/d將()添上
答案:
代碼如下 |
複製代碼 |
<?php /** by */ $a = '/a/b/c/d/e.php'; $b = '/a/b/13/34/c.php'; echo getRelativePath($a, $b); //"../../12/34/" function getRelativePath($a,$b){ $a2array = explode('/', $a); $b2array = explode('/', $b); $relativePath = ''; for( $i = 1; $i <= count($b2array)-2; $i++ ) { $relativePath .= $a2array[$i] == $b2array[$i] ? '../' : $b2array[$i].'/'; } return $relativePath; } ?> |
4.寫一個函數,能夠遍曆一個檔案夾下的所有檔案和子檔案夾。
答:這個我之前就在部落格中寫過(PHP檔案遍曆及檔案拷貝),只是實現的方法很多,效率不一定最高
代碼如下 |
複製代碼 |
/* *@blog */ function listDir($dir = '.'){ if ($handle = opendir($dir)) { while (false !== ($file = readdir($handle))) { if($file == '.' || $file == '..'){ continue; } if(is_dir($sub_dir = realpath($dir.'/'.$file))){ echo 'FILE in PATH:'.$dir.':'.$file.'<br>'; listDir($sub_dir); }else{ echo 'FILE:'.$file.'<br>'; } } closedir($handle); } } listDir('e:wwwabc');
|
5.簡述論壇中無限分類的實現原理。
答:無限極分類,那麼應該是考察遞迴函式吧!
第一步:建立測試資料庫:
代碼如下 |
複製代碼 |
CREATE TABLE `category` ( `id` smallint(5) unsigned NOT NULL auto_increment, `fid` smallint(5) unsigned NOT NULL default '0', `value` varchar(50) NOT NULL default '', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; |
第二步:插入測試資料:
代碼如下 |
複製代碼 |
INSERT INTO `category` ( `fid`, `value`) VALUES (0, 'PHP點點通部落格Pxx.COM'), (1,'a'), (1,'b'), (2,'c'), (2,'d'), (4,'e') |
第三步:遞迴輸出分類:
代碼如下 |
複製代碼 |
<?php /** by */ $conn = mysql_connect("localhost", "root", "mckee"); mysql_select_db("test",$conn); mysql_query("set names utf8"); $sql = "SELECT * FROM category"; $res = mysql_query($sql); while($row = mysql_fetch_assoc($res)){ $arr[] = array($row[id],$row[fid],$row[value]); } getCate(0); function getCate($fid = 0) { global $arr; for ($i = 0; $i < count($arr); $i++) { if ($arr[$i][1] == $fid) { echo $arr[$i][2] . "<br>"; getCate($arr[$i][0]); //遞迴 } } } ?>
|
6.設計一個網頁,使得開啟它時彈出一個全屏的視窗,該視窗中有一個文字框和一個按鈕。使用者在文字框中輸入資訊後點擊按鈕就可以把視窗關閉,而輸入的資訊卻在主網頁中顯示!
答案:尼瑪。都沒明白出這題目是幹嘛的,新浪工程師腦子進水了嗎?考察js的window對象?親們告訴我?
index.html
代碼如下 |
複製代碼 |
<html> <head> <title>by </title> </head> <body> <h1></h1> <script type="text/javascript"> open('fullwin.html'); </script> </body> </html> |
fullwin.html
代碼如下 |
複製代碼 |
<html> <head> <title>by </title> </head> <body> <script type="text/javascript"> window.moveTo(0, 0); window.resizeTo(window.screen.width, window.screen.height); var s = prompt('請輸入:'); window.opener.document.getElementsByTagName('h1')[0].innerText = s; window.close(); </script> </body> </html>
|
unset引用
代碼如下 |
複製代碼 |
<?php $a = "this is a php blog"; $b = & $a; unset($b); echo $a; //this is a php blog ?> |
這個我很清楚,unset($b),只是斷開了變數名和值得綁定,但是神奇的是:
代碼如下 |
複製代碼 |
<?php $a = "test"; $b = & $a; unset($a); echo $b;//test ?> |
但是我銷毀$a了,為嘛$b的值還在呢?暈了,求解!
感謝下面網友回複,讓我明白了:
關於unset()函數使用注意:只有當指向該值的所有變數(比如有引用變數指向該值)都被銷毀後,地址才會被釋放,如下:
代碼如下 |
複製代碼 |
<?php /** by www.111cn.net */ $a = "test"; $b = & $a; unset($a); unset($b); echo $b;//輸出空 ?> |