ThinkPHP コード
クライアント IP アドレスを取得します
?
クライアント IP アドレスを取得します
$type は戻り値のタイプを表します。 0 は IP アドレスを返します。 1 は IPV4 アドレス番号を返します。
関数 get_client_ip($type = 0) {
? = ?$タイプ ?
? 静的 $ip ?= NULL;? if ($ip !== NULL) $ip[$type];
? if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
? $arr ?= ? 爆発(',', $_SERVER['HTTP_X_FORWARDED_FOR']); ? $pos ?= ?? if(false !== $pos);
? $ip?
? }elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
? $_SERVER['HTTP_CLIENT_IP'] ?
? }elseif (isset($_SERVER['REMOTE_ADDR'])) {? $_SERVER['REMOTE_ADDR'] ?
?}
? // IP アドレスの正当な検証
? $long = ip2long($ip);
? $ip ? = $long : array('0.0.0.0', 0);
? $ip[$type];を返しますか?
}?
?
ファイルのバイトサイズのフォーマット
?
バイトフォーマット B K M G T
で記述されたサイズにバイト数をフォーマットします。
関数 byte_format($size, $dec=2){? $a = array("B", "KB", "MB", "GB", "TB", "PB");
? $pos = 0;
? while ($size >= 1024) {
?$サイズ /= 1024;
?$pos++;?
?}? ラウンド($size,$dec)を返します。" ".$a[$pos];
}
または
関数 get_size($s,$u='B',$p=1){ ?
? $us = 配列('B'=>'K','K'=>'M','M'=>'G','G'=>'T') ; ?
? return (($u!=='B')&&(!isset($us[$u]))||($s } ?
?
?
虹の文字列を表示
は虹の文字列を表示するために使用され、UTF8 と中国語をサポートしており、効果は次のとおりです:
関数 color_txt($str){
? $len ?= mb_strlen($str);
? $colorTxt ?
? for($i=0; $i ? $colorTxt .= ?' ?}? $colorTxt;
を返しますか?
}関数 rand_color(){
? '#' を返します。sprintf("%02X",mt_rand(0,255)).sprintf("%02X",mt_rand(0,255)) 🎜>
}
?
?
PHP でファイルのダウンロードを高速化します
一般的に言えば、ドキュメント ルートの下にあるファイルへの URL を直接指定することで、ユーザーにファイルをダウンロードさせることができます。
?
ただし、これを行うと、統計や権限チェックなどを行うことができなくなります。そのため、多くの場合、PHP を使用して転送を行い、ユーザーにファイルのダウンロードを提供します。
$file = "/tmp/dummy.tar.gz";
header("Content-type: application/octet-stream");
header('Content-Disposition:attachment; filename="' .basename($file) .'"');
header("Content-Length: ".filesize($file));
読み取りファイル($file);
?
しかし、これには問題があります。ファイル名が中国語の場合、一部のユーザーは文字化けしたファイル名をダウンロードする可能性があります。
?
そこで、いくつかの変更を加えてみましょう (参考:
$file = "/tmp/中文名.tar.gz";
$filename = ベース名($file);
header("Content-type: application/octet-stream");
//中国語のファイル名を処理します
$ua = $_SERVER["HTTP_USER_AGENT"];
$encoded_filename = urlencode($filename);
$encoded_filename = str_replace("+", "%20", $encoded_filename);
if (preg_match("/MSIE/", $ua)) {
header('Content-Disposition:attachment; filename="' . $encoded_filename . '"');
} else if (preg_match("/Firefox/", $ua)) {
Header("Content-Disposition:attachment; filename*="utf8''" . $filename . '"');
} else {
header('Content-Disposition:attachment; filename="' . $filename . '"');
}
header('Content-Disposition:attachment; filename="' . $filename . '"');
header("Content-Length: ".filesize($file));
読み取りファイル($file);
?
これでかなり良くなったように見えますが、まだ問題があり、それは PHP の readfile です。PHP の readfile は可能な限り効率的であり、PHP 自体のメモリを占有しないように努めていますが、実際には依然として MMAP を使用する必要があります (サポートされている場合)、またはループでファイルを読み取り、直接出力するための固定バッファー。
?
出力する場合、Apache + PHP mod の場合は、Apache の出力バッファに送信する必要があります。Nginx + fpm の場合は、別々にデプロイされている場合も同様です。追加のネットワーク IO。
?
では、Web サーバーは PHP 層を経由せずにユーザーに直接ファイルを送信できますか?
?
今日、興味深い記事を見つけました: How I PHP: X-SendFile.
?
Apache のモジュール mod_xsendfile を使用すると、Apache がこのファイルをユーザーに直接送信できるようになります:
$file = "/tmp/中文名.tar.gz";
$filename = ベース名($file);
header("Content-type: application/octet-stream");
//中国語のファイル名を処理します
$ua = $_SERVER["HTTP_USER_AGENT"];
$encoded_filename = urlencode($filename);
$encoded_filename = str_replace("+", "%20", $encoded_filename);
if (preg_match("/MSIE/", $ua)) {
header('Content-Disposition:attachment; filename="' . $encoded_filename . '"');
} else if (preg_match("/Firefox/", $ua)) {
Header("Content-Disposition:attachment; filename*="utf8''" . $filename . '"');
} else {
header('Content-Disposition:attachment; filename="' . $filename . '"');
}
header('Content-Disposition:attachment; filename="' .basename($file) .'"');
//Xsendfile にファイルを送信させます
header("X-Sendfile: $file");
?
X-Sendfile ヘッダーは Apache によって処理され、応答ファイルはクライアントに直接送信されます。
Lighttpd と Nginx にも同様のモジュールがありますので、興味があればチェックしてください
?
?
index.php を非表示にするように htaccess ファイルを設定します
Apache環境でURLアドレス内のindex.phpを隠すために使用されます
リライトエンジンがオン
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$index.php/$1 [QSA,PT,L]
?
?
PHP コードから空白とコメントを削除します
PHP には、php ファイルを読み取り、コード内の空白やコメントを削除する組み込みの php_strip_whitespace メソッドがありますが、空白やコメントを削除するためのコンテンツの直接読み取りはサポートされていません。次のメソッドは、文字列コンテンツの読み取りと ThinkPHP をサポートします。このメソッドはフレームワークに組み込まれています。
/**
?* コードから空白とコメントを削除します
?* @param string $content code content
?* @戻り文字列
?*/
関数strip_whitespace($content) {
? $stripStr ?
? //php ソースコードを分析します? $token_get_all($content);
? $last_space = false;
? for ($i = 0, $j = count($tokens); $i ? if (is_string($tokens[$i])) {
??
? $stripStr ?.= $tokens[$i];
??? スイッチ ($tokens[$i][0])
? // さまざまな PHP コメントをフィルタリングします。?
??
??
??
??
??
???
?? ??($k = $j; $k++) ?? if($tokens[$k]) ? ?? ? ? ? ? } if($k][0] ? ?
??
?? ?? $stripStr??
??
?}? $stripStr;
を返しますか?
}?
?
文字列が UTF8 でエンコードされているかどうかを確認します
文字列が UTF8 でエンコードされているかどうかを判断するために使用されます
関数 is_utf8($string){
? return preg_match('%^(?:
??[x09x0Dx20-x7E] ?
?| [xC2-xDF][x80-xBF] ?
??xE0[xA0-xBF] ?# オーバーロングを除く?| [xE1-xECxEExEF][x80-xBF] ?# ストレート 3 バイト
??xED[x80-xBF] ?#
?| xF0[x90-xBF]{2} ??| [xF1-xF3][x80-xBF] ?# 平面
?| xF4[x80-xBF]{2} ??)*$%xs', $string);
}
?
?
XSS セキュリティ フィルタリング
インターネットから取得され、文字列の XSS セキュリティ フィルタリングに使用されます。
removefunction_xss($val) {
? ?// 印刷できない文字をすべて削除します。 CR(0a)、LF(0b)、TAB(9) が許可されます
? ?// これにより、
? ?// 一部の入力では n、r、t が *許可されている*ため、後で n、r、t による分割を処理する必要があることに注意してください
? ?$val = preg_replace('/([x00-x08,x0b-x0c,x0e-x19])/', '', $val);
? ?// 直接の置換。通常の文字であるため、ユーザーはこれらを必要としないはずです
? ?// これにより、
のようなことが防止されます。? ?$search = 'abcdefghijklmnopqrstuvwxyz';
? ?$search .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
? ?$search .= '1234567890!@#$%^&*()';
? ?$search .= '~`";:?+/={}[]-_|'\';
? ?for ($i = 0; $i < strlen($search); $i++) {
? ? ? // ;? ; に一致します。これはオプションです
? ? ? // 0{0,7} は任意の埋め込みゼロと一致します。これはオプションであり、最大 8 文字までです
? ? ? // @ @ 16 進数値を検索
? ? ? $val = preg_replace('/([xX]0{0,8}'.dechex(ord($search[$i])).';?)/i', $search[$i], $値); // ;
付き? ? ? // @ @ 0{0,7} は '0' と 0 ~ 7 回一致します
? ? ? $val = preg_replace('/(?{0,8}'.ord($search[$i]).';?)/', $search[$i], $val); // ;
付き? ?}
? ?// 現在、残っている空白攻撃は t、n、r
だけです? ?$ra1 = array('javascript', 'vbscript', 'expression', 'applet', 'meta', 'xml', 'blink', 'link', 'style', 'script', 'embed', 'object', 'iframe', 'frame', 'frameset', 'ilayer', 'layer', 'bgsound', 'title', 'base');
? ?$ra2 = array('onabort', 'onactivate', 'onafterprint', 'onafterupdate', 'onbeforeactivate', 'onbeforecopy', 'onbeforecut', 'onbeforedeactivate', 'onbeforeeditfocus', 'onbeforepaste', 'onbeforeprint', 'onbeforeunload'、'onbeforeupdate'、'onblur'、'onbounce'、'oncellchange'、'onchange'、'onclick'、'oncontextmenu'、'oncontrolselect'、'oncopy'、'oncut'、'ondataavailable'、'ondatasetchanged '、'ondatasetcomplete'、'ondblclick'、'ondeactivate'、'ondrag'、'ondragend'、'ondragenter'、'ondragleave'、'ondragover'、'ondragstart'、'ondrop'、'onerror'、'onerrorupdate'、 'onfilterchange'、'onfinish'、'onfocus'、'onfocusin'、'onfocusout'、'onhelp'、'onkeydown'、'onkeypress'、'onkeyup'、'onlayoutcomplete'、'onload'、'onlosecapture'、'onmousedown '、'onmouseenter'、'onmouseleave'、'onmousemove'、'onmouseout'、'onmouseover'、'onmouseup'、'onmousewheel'、'onmove'、'onmoveend'、'onmovestart'、'onpaste'、'onpropertychange'、 'onreadystatechange'、'onreset'、'onresize'、'onresizeend'、'onresizestart'、'onrowenter'、'onrowexit'、'onrowsdelete'、'onrowsinserted'、'onscroll'、'onselect'、'onselectionchange'、'onselectstart '、'onstart'、'onstop'、'onsubmit'、'onunload');
? ?$ra = array_merge($ra1, $ra2);
? ?$found = true; // 前のラウンドで何かが置き換えられている限り、置き換えを続けます
? ?while ($found == true) {
? ? ? $val_before = $val;
? ? ? for ($i = 0; $i ? ? ? ? ?$pattern = '/'; ? ? ? ? ?for ($j = 0; $j ? ? ? ? ? ? if ($j > 0) { ? ? ? ? ? ? ? ?$pattern .= '('; ? ? ? ? ? ? ? ?$pattern .= '([xX]0{0,8}([9ab]);)'; ? ? ? ? ? ? ? ?$pattern .= '|'; ? ? ? ? ? ? ? ?$pattern .= '|(?{0,8}([9|10|13]);)'; ? ? ? ? ? ? ? ?$pattern .= ')*'; ? ? ? ? ? ? } ? ? ? ? ? ? $pattern .= $ra[$i][$j]; ? ? ? ? ?} ? ? ? ? ?$pattern .= '/i'; ? ? ? ? ?$replacement = substr($ra[$i], 0, 2).' ? ? ? ? ?$val = preg_replace($pattern, $replacement, $val); // 16 進タグをフィルターで除外します ? ? ? ? ?if ($val_before == $val) { ? ? ? ? ? ? // 置換は行われなかったため、ループを終了します ? ? ? ? ? ? $found = false; ? ? ? ? ?} ? ? ? } ? ?} ? ?return $val; } ? ? Cookie 使用法の例 cookie メソッドは、Cookie の設定、取得、および削除の操作を実行するために使用される、ThinkPHP 内の関数です。
删除 特定の cookie を削除して使用可能: cookie('name',null); ? クリアクッキーが必要な場合に使用できます: クッキー(null); // 清空当前設定前缀のすべての cookie 值 cookie(null,'think_'); // ?清空指定前缀のすべてのcookie值 ? ? 検証コードが表示されないのはBOM情報が原因である場合が多いです。(BOM情報を一括削除するコード) ローカルのテスト環境では検証コードを表示する必要がある場所が問題なくサーバーにデプロイされると、検証コードを表示する必要がある場所が表示されない場合があります。 、以下をお読みください。
例: サーバーのルート ディレクトリに新しい delBom.php ファイルを作成します。 http://www.xxx.com/delBom.php を実行します。コードは次のとおりです。
if (isset($_GET['dir'])){ //ファイルディレクトリを設定しますか? $basedir=$_GET['dir'] ? }その他{ ? $basedir = '.' ? } ? $auto = 1 ? checkdir($basedir) ? 関数 checkdir($basedir){ ? if ($dh = opendir($basedir)) { ? ? while (($file = readdir($dh)) !== false) { ? ?if ($file != '.' && $file != '..'){ ? ? if (!is_dir($basedir."/".$file)) { ? ? ?echo "ファイル名: $basedir/$file ".checkBOM("$basedir/$file") ? ? }その他{ ?
? ?} ? ? } ? closedir($dh) ? } ? } ? 関数 checkBOM ($filename) { ? グローバル $auto ? $contents = file_get_contents($filename) ? $charset[1] = substr($contents, 0, 1) ? $charset[2] = substr($contents, 1, 1) ? $charset[3] = substr($contents, 2, 1) ? if (ord($charset[1]) == 239 && ord($charset[2]) == 187 && ord($charset[3]) == 191) { ? ? if ($auto == 1) { ? ?$rest = substr($contents, 3)? ?rewrite ($filename, $rest)? ?return ("BOM が見つかりました。自動的に削除されました。_http://www.k686.com< ;/font>"); ? ? } else { ? ?return ("BOM が見つかりました。");
を意味します
が付いた擬似静的 URL アドレスを出力することを意味します
は、現在のドメイン名を使用するブログの第 2 レベル ドメイン名アドレスを示します。 ? アンカー ポイントの生成をサポートします (サポートするには、最新の Git バージョンを更新する必要があることに注意してください) U('ブログ/read#review','id=5'); ? 生成された URL アドレスには、コメント セクションに簡単にジャンプできるように、最後に #review アンカーが付きます。 ? ? 画像のHTTPキャッシュを設定し、JSとCSSも設定できます Apache 環境の場合、.htaccess ファイルに次のコードを追加して、イメージの HTTP キャッシュと有効期間を設定し (Apache のヘッダー モジュールのサポートを有効にする必要があります)、イメージ リソースのリクエストを減らすことができます。ウェブサイトの負荷を軽減し、アクセス速度とページ速度の値を改善します^_^。 ヘッダー セット キャッシュ コントロール "max-age=604800" ? 上記のコードは、Web サイト上の画像に 1 週間の HTTP キャッシュを設定します。もちろん、http キャッシュを js または css ファイルに追加することもできます。 ? ? 文字列に外部リンクがあるかどうかを確認します /** ?* all_external_link は文字列に外部リンクが含まれているかどうかを検出します ?* @param ?string ?$text text ?* @param ?string ?$ホスト ドメイン名 ?* @return boolean ? 外部リンクの場合は true ?*/ 関数 all_external_link($text = '', $host = '') { ? if (empty($host)) $host = $_SERVER['HTTP_HOST']; ? $reg = '/http(?:s?)://((?:[A-za-z0-9-]+.)+[A-za-z]{2,4} )/'; ? preg_match_all($reg, $text, $data); ?$math = $data[1]; ? foreach ($math を $value) { ? if($value != $host) ; ?} ? } ? ? htaccess でドメイン名のリダイレクトを設定します Apache 環境でのみ使用されます。htaccess ファイルに次のコードを追加すると、abc.com にアクセスすると、www.abc.com にリダイレクトされます。もちろん、他のドメイン名へのリダイレクトを設定することもできます。 リライトエンジンがオン RewriteCond %{HTTP_HOST} ^abc.com$ [NC] RewriteRule ^(.*)$ http://www.abc.com/$1 [R=301,L] ? ? PHP はクライアントの IP、地理情報、ブラウザ情報、ローカルの実際の IP を取得します
?// クライアントの IP、地理情報、ブラウザ、ローカルの実 IP を取得する関数 ?class get_gust_info {? ?? ? ////訪問者のブラウザの種類を取得します ?関数 GetBrowser(){ ?if(!empty($_SERVER['HTTP_USER_AGENT'])){ ? $br = $_SERVER['HTTP_USER_AGENT']; ? if (preg_match('/MSIE/i',$br)) { ?
?} ? $br; ?}else{return "ブラウザ情報の取得に失敗しました!";}? ?} ?? ? ////訪問者のブラウザ言語を取得します ?関数 GetLang(){ ?if(!empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])){ ? $lang = $_SERVER['HTTP_ACCEPT_LANGUAGE']; ? $lang = substr($lang,0,5); ? if(preg_match("/zh-cn/i",$lang)){ ?$lang = "簡体字中国語"; ? }elseif(preg_match("/zh/i",$lang)){ ?$lang = "繁体字中国語"; ? }その他{ ? $lang = "英語" ?
を返しますか?
? $ip = $ips[$i]; ?? ? ?} ? ?$tip = empty($_SERVER['REMOTE_ADDR']) ?$ip : $_SERVER['REMOTE_ADDR'];? ?if($tip=="127.0.0.1"){ //ローカルの実際の IP を取得します ? $this->get_onlineip();
?preg_match("/[.*]/",$mip,$sip)?
?$p = 配列("/[/","/]/")?
??preg_replace($p,"",$sip[0]);
?$ip = $this->? ?} ?$ipadd = file_get_contents("http://int.dpool.sina.com.cn/iplookup/iplookup.php?ip=".$ip);//Sina API インターフェースに従って ?if($ipad){ ? $charset = iconv("gbk","utf-8",$ipadd);
?}else{return "宛先がありません";} ? ?}? ?} ?$gifo = new get_gust_info(); ?echo "あなたの IP:".$gifo->Getip(); ?echo " ?$ipadds = $gifo->Getaddress(); ?foreach($ipadds[0] as $value){ ?} ? ?echo " ?echo " ?echo " ?? ? ??> ? ? URL セーフ文字列の Base64 エンコードとデコード base64_encode メソッドとbase64_decode メソッドを直接使用すると、生成された文字列が URL アドレスに適さない可能性があります。次の方法でこの問題を解決できます: URL セーフな文字列エンコーディング: 関数 urlsafe_b64encode($string) { ?$data =base64_encode($string); ?$data = str_replace(array('+','/','='),array('-','_',''),$data); ?$data を返す; } ? URL セーフ文字列デコード: 関数 urlsafe_b64decode($string) { ?$data = str_replace(array('-','_'),array('+','/'),$string); ?$mod4 = strlen($data) % 4; ?if ($mod4) {
?*/ 関数 get_client_browser($glue = null) { ? $ブラウザ = 配列(); ? $agent = $_SERVER['HTTP_USER_AGENT']; // クライアント情報を取得します。
)
? 'クロム' ?=> '/(d+.d+)/', ? 'Firefox' =>
? 'サファリ' ?=> '/バージョン/(d+.d+.d)/', ); ? foreach($regex as $type => $reg) { ?preg_match($reg、$agent、$data)?
? $browser = $data[1]) : array($data[1]) ; ?
?} ? return empty($browser) ? false : (is_null($glue) ? $browser : implode($glue, $browser));
? ? elseif ($t < 60) ? ? ? ? $text = $t . '秒前'; // 一分钟内 ? ? elseif ($t < 60 * 60) ? ? ? ? $text = floor($t / 60) . '分钟前'; //一小时内 ? ? elseif ($t < 60 * 60 * 24) ? ? ? ? $text = floor($t / (60 * 60)) . '小时前'; // 一天内 ? ? elseif ($t < 60 * 60 * 24 * 3) ? ? ? ? $text = floor($time/(60*60*24)) ==1 ?'昨天 ' . date('H:i', $time) : '前天 ' . date('H:i', $time) ; //昨天和前天 ? ? elseif ($t < 60 * 60 * 24 * 30) ? ? ? ? $text = date('m月d日 H:i', $time); //一个月内 ? ? elseif ($t < 60 * 60 * 24 * 365) ? ? ? ? $text = date('m月d日', $time); //一年内 ? ? else ? ? ? ? $text = date('Y年m月d日', $time); //一年以前 ? ? return $text; } ? 使用此函数,我们只需在前台用 {$vo.time|mdate} ? 实现时间友好化显示了 ? ? 将返回的数据集转换成树结构 /** ?* 将返回的数据集转换成树 ?* @param ?array ? $list ?数据集 ?* @param ?string ?$pk ? ?主键 ?* @param ?string ?$pid ? 父节点名称 ?* @param ?string ?$child 子节点名称 ?* @param ?integer $root ?根节点ID ?* @return array ? ? ? ? ?转换后的树 ?*/ function list_to_tree($list, $pk = 'id', $pid = 'pid', $child = '_child', $root=0) { ? ? $tree = array();// 创建Tree ? ? if(is_array($list)) { ? ? ? ? // 创建基于主键的数组引用 ? ? ? ? $refer = array(); ? ? ? ? foreach ($list as $key => $data) { ? ? ? ? ? ? $refer[$data[$pk]] =& $list[$key]; ? ? ? ? } ? ? ? ?? ? ? ? ? foreach ($list as $key => $data) { ? ? ? ? ? ? // 判断是否存在parent ? ? ? ? ? ? $parentId = $data[$pid]; ? ? ? ? ? ? if ($root == $parentId) { ? ? ? ? ? ? ? ? $tree[$data[$pk]] =& $list[$key]; ? ? ? ? ? ? }else{ ? ? ? ? ? ? ? ? if (isset($refer[$parentId])) { ? ? ? ? ? ? ? ? ? ? $parent =& $refer[$parentId]; ? ? ? ? ? ? ? ? ? ? $parent[$child][] =& $list[$key]; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? } ? ? } ? ? return $tree; } ? ? 头像编辑-当不改变头像时 目前是这么做的 将上传判断代码段 ?/* ?if(!$upload->upload()) {// 上传错误提示错误信息 ? ? $this->error($upload->getErrorMsg()); ?}else{// 上传成功 获取上传文件信息? ? ? $info = ?$upload->getUploadFileInfo(); ?} ?*/ ? 改为: $upload->upload(); $info = ?$upload->getUploadFileInfo(); ? 这样即使不上传图片也不提示错误, 然后在上传页面 添加 ? ? 在update()方法中做如下判断: if(is_null($info[0]["savename"])){ ? ? $data['face']=$_POST['face']; }else{ ? ? $data['face']=$info[0]["savename"]; } ? ? 合并数组函数 调用PHP原生的array_merge时,如果第一个参数为空,则会导致返回结果为空。这个函数做了相应处理。 function MergeArray($list1,$list2) { ? ? if(!isEmpty($list1) && !isEmpty($list2))? ? ? { ? ? ? ? return array_merge($list1,$list2); ? ? } ? ? else return (isEmpty($list1)?(isEmpty($list2)?null:$list2):$list1); } function isEmpty($data) { ? ? return null == $data || false == $data || "" == $data; } ? ? Google翻译插件调用,采用CURL调取 调用Google翻译的接口,需要开启curl支持。
? ? /* ? ? ? ? Google翻译函数 by QQ366958903 ? ? ? ? $text ? ?要翻译的文本 ? ? ? ? $tl ? ? ? ?目标语言 ? ? ? ? $sl ? ? ? ?原语言 ? ? ? ? $ie ? ? ? ?字符编码 ? ? */ ? ?? ? ? function translate($text='',$tl='zh-CN',$sl='auto',$ie='UTF-8'){ ? ? ? ? $ch = curl_init('http://translate.google.cn/'); ? ? ? ? curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1); ? ? ? ? curl_setopt($ch, CURLOPT_POSTFIELDS,"&hl=zh-CN&sl={$sl}&ie={$ie}&tl={$tl}&text=".urlencode($text));? ? ? ? ? $html = curl_exec($ch); ? ? ? ? preg_match('#(.*?)
Location:";
ブラウザの種類:".$gifo->GetBrowser();
ブラウザ言語:".$gifo->GetLang();
オペレーティング システム:".$gifo->GetOs();