存档
php正则匹配简明
. |
Any character except newline. |
\. |
A period (and so on for \*, \(, \\, etc.) |
^ |
The start of the string. |
$ |
The end of the string. |
\d,\w,\s |
A digit, word character [A-Za-z0-9_], or whitespace. |
\D,\W,\S |
Anything except a digit, word character, or whitespace. |
[abc] |
Character a, b, or c. |
[a-z] |
a through z. |
[^abc] |
Any character except a, b, or c. |
aa|bb |
Either aa or bb. |
? |
Zero or one of the preceding element. |
* |
Zero or more of the preceding element. |
+ |
One or more of the preceding element. |
{n} |
Exactly n of the preceding element. |
{n,} |
n or more of the preceding element. |
{m,n} |
Between m and n of the preceding element. |
??,*?,+?,{n}?, etc. |
Same as above, but as few as possible. |
(expr) |
Capture expr for use with \1, etc. |
(?:expr) |
Non-capturing group. |
(?=expr) |
Followed by expr. |
(?!expr) |
Not followed by expr. |
在线php正则检测 http://regexpal.com/
ThinkPHP框架如何修改去掉X-Powered-By
这两天用网站header信息查看工具看了一下头部信息发现如下
http://www.quancha.cn/header/www.quancha.cn.html
HTTP/1.0 200 OK
Date: Wed, 23 Nov 2011 01:27:05 GMT
Server: Apache/2.2.14 (Ubuntu)
X-Powered-By: ThinkPHP2.1
Set-Cookie: PHPSESSID=q1vvtpiv3s9mo6nmkkvher8bl2; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: private
Pragma: no-cache
其中一行表示用thinkphp开发的这样容易被人利用已知漏洞攻击
去掉方法
iis rewrite 原始 request_uri
话说重写:
网站结构如下:
index.php
source/src_{模块名}.php
template/tpl_{模块名}.php
通过首页统一入口来访问各个模块文件,
比如,最简单的统一入口访问代码:
define('ROOT', dirname(__FILE__));
$mod = isset($_GET['mod']) ? $_GET['mod'] : 'index';
$src = ROOT . 'source/src_' . $mod . '.php' ;
$tpl = ROOT . 'template/src_' . $mod . '.php' ;
file_exists($src) && include($src) ;
file_exists($tpl) && include($tpl) ;
现在访问一个地址:index.php?mod=news ;则会访问source/src_news.php 文件。
现在要让url重写,访问 /news 这个url能实现一样的效果,
Linux下的Apache和Nginx,
windows下的ISAPI_Rewrite模块重写,
重写要求,如果我访问的是不存在的文件,重定向到index.php,通过获取实际访问的url,来判断该调用哪个文件,如果我访问 /news?page=1 这个URL,重定向后:
三个服务器访问后的结果:
Apache 关于开启rewrite模块后,会产生三个头部:
$_SERVER['REDIRECT_STATUS'] => 200 (证明重写成功)
$_SERVER['REDIRECT_QUERY_STRING'] => page=1
$_SERVER['REDIRECT_URL'] => /news
而IIS的rewrite模块重写后,会有
$_SERVER['REDIRECT_STATUS'] => 200
$_SERVER['HTTP_X_REWRITE_URL'] => /news
Nginx重写后有:
$_SERVER['REDIRECT_STATUS'] => 200
所以,如果采用 $_SERVER['REDIRECT_URL'] 或 $_SERVER['HTTP_X_REWRITE_URL']都是不可取的,因为Nginx重写后,不产生重写URL,三个服务器并没有交集,如果还考虑其他服务器比如 lighttpd,cheroke等,可能产生的头部更加不一致。
通常需要考虑的就是PHP的 $_SERVER['REQUEST_URI']
现在看看这几个服务器产生的 REQUEST_URI是否一致:
apache下:
$_SERVER['REQUEST_URI'] => /news
Nginx下:
$_SERVER['REQUEST_URI'] => /news
IIS下:
$_SERVER['REQUEST_URI'] => /index.php/news
这他妈是怎么回事?干嘛加个/index.php这个玩意呢?我没有搞懂,不过IIS的重写不完全支持.htaccess语法,所以,不知道是否是我配置的问题,但是我绞尽脑汁也弄不掉这个/index.php
所以,干脆用IIS专用的 $_SERVER['HTTP_X_REWRITE_URL'] 来替换 $_SERVER['REQUEST_URI']
暂时世界清静了。
要提取完整的重写后的URL地址,还没这么简单,需要考虑子目录下重写的情况,下回放出完整的无bug的提取重写url的函数,依靠此函数,将函数分割,然后形成$controller, $action .. 等参数
PHP中session和cookie详解
1.session保存在服务器端,生存期为上次刷新起+session超时时间。设置session后立刻生效。
2.cookie保存在本地,可以设置有效期时长,本次设置,刷新后生效;所有cookie必须在header输出前设置才能有效,之后设置的cookie不会起作用。
3.seesion+cookie来完成用户验证思路。
1.用户登录后记录session,会话期有效,关闭浏览器后失效,需要重新登录。
3.记住用户登录状态,把用户的id和pwd保存在cookie中,存在本地,下次登录验证即可。本次刷新直接证seesion,不存在的情况下再验证cookie是够存在。
seesion+cookie用户登录验证流程:
a.获取uid(先session、后cookie)
b.查数据库,返回页面信息
1)如果是session获得的id,更新下session的id,通过id查数据库,返回用户信息。
2)如果是cookie获得的id,则从cookie中获取用户名、密码,验证数据库。成功返回id,过id查数据库,返回用户信息;错误返回空。
c.利用用户信息,页面判断输出
discuz模板中的$_G['setting']['seohead'] 作用
通过查看模板代码 header_common.htm中看到$_G['setting']['seohead'],
需要找到对该变量赋值文件forum_viewthread.htm,通过它的值我们就可以知道它起作用了。
$_G['setting']['seohead'] .= '
';
rel=”canonical”有什么作用?他可以防止站点重复内容被搜索引擎多次编制索引,并且可以把重复内容页面质量最好一个的进行选择索引,这样就可以解决重复内容被搜索引擎索引的烦恼,从而保障站点内容整体质量的提升。对站点关键词流量提升有非常大的作用。
那么我们如何来运用rel=”canonical”呢?
例子讲解:
比如www.moonseo.cn 有两个重复内容页面分别是:
http://www.moonseo.cn/forumdisplay.php?fid=22
http://www.moonseo.cn/forumdisplay.php?fid=2
如果你要想要后缀字母为22加入谷歌搜索引擎索引,只需要到另一个的页面
部分加入以下代码即可。 这个链接的意思就是告诉谷歌搜索引擎“在内容相同的所有网页中,此网页最有用。请将该网页排在搜索结果中靠前的位置”。当然,你会问,如果不止2个呢?如果是多个页面相同呢?道理是一样的。如果是多个页面。那么你就选出一个为索引页面,再到其他所有的页面加入以上代码。但是请记住rel=”canonical”只是一个提交给谷歌的站点规范建议,而不是一个命令,谷歌会根据你提交的建议而采纳.
php 格式化时间转unix时间
在php中date是个unix的时间格式化输出。
但如何把20110622235959变成unix时间呢,
php提供了一个很好的函数strtotime(20110622235959)
输出1308758399
php 类似charat函数,获取string中的字符
$char = $string{$position}; // where $position is the position of the character you are looking for
$string = "testing";
echo $string{2}; // prints 's'
php正则表达式参数说明
在一些php的行数中经常出现/s /i /U等内容,是不是比较苦恼都代表什么,科普一下吧。
PHP正则表达式模式后面通常带有 /i, /is, /s, /isU等参数,那么这都是些什么东西呢?下面我们一起来看看:
i 匹配大小写
s 模式中的圆点元字符(.)匹配所有的字符,包括换行符
x 模式中的空白字符除了被转义的或在字符类中的以外完全被忽略,在未转义的字符类之外的 # 以及下一个换行符之间的所有字符,包括两 头,也都被忽略
A (PCRE_ANCHORED) 如果设定了此修正符,模式被强制为“anchored”,即强制仅从目标字符串的开头开始匹配即自动在模式开头加上^。
D (PCRE_DOLLAR_ENDONLY) 如果设定了此修正符,模式中的美元元字符仅匹配目标字符串的结尾。没有此选项时,如果最后一个字符是换行符的话,美元符号也会匹配此字符之前(但不会匹配任何其它换行符之前)。如果设定了 m 修正符则忽略此选项。Perl 中没有与其等价的修正符。 S 当一个模式将被使用若干次时,为加速匹配起见值得先对其进行分析。如果设定了此修正符则会进行额外的分析。目前,分析一个模式仅对没有单一固定起始字符的 non-anchored 模式有用。
U (PCRE_UNGREEDY) 本修正符反转了匹配数量的值使其不是默认的重复,而变成在后面跟上“?”才变得重复。这和 Perl 不兼容。也可以通过在模式之中设定 (?U) 修正符来启用此选项。
X (PCRE_EXTRA) 此 修正符启用了一个 PCRE 中与 Perl 不兼容的额外功能。模式中的任何反斜线后面跟上一个没有特殊意义的字母导致一个错误,从而保留此组合以备将 来扩充。默认情况下,和 Perl 一样,一个反斜线后面跟一个没有特殊意义的字母被当成该字母本身。当前没有其它特性受此修正符控制。即:贪婪模式,最 大限度匹配如:/a[w]+?e/U匹配abceadeddd中的abceade而不是abce,如果不加U修正,则匹配abce u (PCRE_UTF8) 此修正符启用了一个 PCRE 中与 Perl 不兼容的额外功能。模式字符串被当成 UTF-8。本修正符在 Unix 下自 PHP 4.1.0 起可用,在 win32 下自 PHP 4.2.3 起可用