php正则表达式手册
❶ 这一段php中正则表达式的详细含义……
拆分这段正则:
'
(and|or)\b.+?(>|<|=|in|like)
\/\*.+?\*\/
<\s*script\b
\bEXEC\b
UNION.+?SELECT
UPDATE.+?SET
INSERT\s+INTO.+?VALUES
(SELECT|DELETE).+?FROM
(CREATE|ALTER|DROP|TRUNCATE)\s+(TABLE|DATABASE)
你仔细看看,每一条都是对应一种数据库语句可能会出现的情况(除了第3条):
第一条是 单引号,单引号在数据库语句中的作用不用我多说了
第二条是 模糊孙查询
第三条是“*.*”这种数据库万能语句
第四条我觉得可能是<script>的html标签
第五条是 exec数据库动态查询语句
第六条是 UNION联合查询
第七条是 数据库更新语句
第八条是 数据表插入
第九条是 查询或删除数据
第十条是 创建、修改、删除等数据库操作
而这条语句的作用就是使用正则从字符串中查找是否存在数据库操作相关的敏感字符串,从而对该字符串进行一定的处理,保障服务器安全。
(以上)
❷ php中正则表达式是如何使用的
如果你的正则是对的话,代码应该如下
$reg='[a-zA-zs]+';
preg_match($reg,$string,$matchs);
//结果
$result='';
foreach($matchs[1]as$m){
$result.=$m
}
❸ 怎样解读php中的正则表达式 (求详解)
^(https?|ftps?) -------- 以https或ftps开头 (协议名)
:\/\/ ------------------- ://
([a-zA-Z0-9-]+\.){1,5} ----- 一个以上的大小写字母或数字加点'.'为一组,出现1组到5组(域名)
(com|cn|net) ---------------- com或cn或net
\/? ---------------------------- 可能有一个/
(\/?index.php)? ----------------- 可能有index.php 文件名
(\??(\w+=\S+&?)+)?/' ---------- 可能有问号(加一个以上的字符,加等于号,可能有&)括号里的东西可能重复出现 (用get方式传递的参数)
所以可能匹配: http://abab.aba.com/index.php?id=123&name=jack 这样的url。
感觉这个写的不是很严谨,很多不是想要的也能匹配上。
| 表示或,问号表示出现0次或1次,加好表示出现1次以上,大括号里的是出现次数的上下限。
这个教程不错,简单而且比较够用:http://deerchao.net/tutorials/regex/regex.htm
❹ PHP正则
看一下php手册的pre_match_all()你就明白了
结果排序为$arr[0]保存完整模式的所有匹配, $arr[1] 保存第一个子组的所有匹配,以此类推。
就是说,第一个数组是整个正则表达式匹配的结果,第二个数组是第一个()中的小正则匹配的结果,这个正则有几个括号就有几个数组;
所以你取第一数组就行了
❺ PHP手册里关于正则表达式的详细说明在哪
php手册上没有正则表达式的详细说明,有一本正则表达式的手册,你可以找一下,哪里比较详细。
❻ PHP正则表达式ereg的问题
eregi 和 ereg_replace 这两个函数到5.3以后就被废弃了,可以使用preg_match, preg_replace进行替换,举个例子:
<?php
$wenben="hello,world";
print_r(preg_match('/[a-z]*/i',$wenben));
$result=preg_replace('/[a-z]*/i',"TiHuan",$wenben);
var_mp($result);
preg_replace,就是替换匹配的字符串,并返回替换后的结果。
preg_match, 就是匹配字符串,返回匹配的结果,为0或者1,当第一次匹配成功,就不继续匹配了。
这些文件函数,你都可以参考php 官方手册:
http://cn2.php.net/manual/zh/function.preg-replace.php
❼ php正则表达式的问题
很有必要!!
跟我学正则表达式!
想必很多人都对正则表达式都头疼.今天,我以我的认识,加上网上一些文章,希望用常人都可以理解的表达方式.来和大家分享学习经验.
开篇,还是得说说 ^ 和 $ 他们是分别用来匹配字符串的开始和结束,以下分别举例说明
"^The": 开头一定要有"The"字符串;
"of despair$": 结尾一定要有"of despair" 的字符串;
那么,
"^abc$": 就是要求以abc开头和以abc结尾的字符串,实际上是只有abc匹配
"notice": 匹配包含notice的字符串
你可以看见如果你没有用我们提到的两个字符(最后一个例子),就是说 模式(正则表达式) 可以出现在被检验字符串的任何地方,你没有把他锁定到两边
接着,说说 '*', '+',和 '?',
他们用来表示一个字符可以出现的次数或者顺序. 他们分别表示:
"zero or more"相当于{0,},
"one or more"相当于{1,},
"zero or one."相当于{0,1}, 这里是一些例子:
"ab*": 和ab{0,}同义,匹配以a开头,后面可以接0个或者N个b组成的字符串("a", "ab", "abbb", 等);
"ab+": 和ab{1,}同义,同上条一样,但最少要有一个b存在 ("ab", "abbb", 等.);
"ab?":和ab{0,1}同义,可以没有或者只有一个b;
"a?b+$": 匹配以一个或者0个a再加上一个以上的b结尾的字符串.
要点, '*', '+',和 '?'只管它前面那个字符.
你也可以在大括号里面限制字符出现的个数,比如
"ab{2}": 要求a后面一定要跟两个b(一个也不能少)("abb");
"ab{2,}": 要求a后面一定要有两个或者两个以上b(如"abb", "abbbb", 等.);
"ab{3,5}": 要求a后面可以有2-5个b("abbb", "abbbb", or "abbbbb").
现在我们把一定几个字符放到小括号里,比如:
"a(bc)*": 匹配 a 后面跟0个或者一个"bc";
"a(bc){1,5}": 一个到5个 "bc."
还有一个字符 '│', 相当于OR 操作:
"hi│hello": 匹配含有"hi" 或者 "hello" 的 字符串;
"(b│cd)ef": 匹配含有 "bef" 或者 "cdef"的字符串;
"(a│b)*c": 匹配含有这样多个(包括0个)a或b,后面跟一个c
的字符串;
一个点('.')可以代表所有的单一字符,不包括"n"
如果,要匹配包括"n"在内的所有单个字符,怎么办?
对了,用'[n.]'这种模式.
"a.[0-9]": 一个a加一个字符再加一个0到9的数字
"^.{3}$": 三个任意字符结尾 .
中括号括住的内容只匹配一个单一的字符
"^[a-zA-Z0-9]"@"[a-zA-Z0-9]"."[a-zA-Z]$"
"[ab]": 匹配单个的 a 或者 b ( 和 "a│b" 一样);
"[a-d]": 匹配'a' 到'd'的单个字符 (和"a│b│c│d" 还有 "[abcd]"效果一样); 一般我们都用[a-zA-Z]来指定字符为一个大小写英文
"^[a-zA-Z]": 匹配以大小写字母开头的字符串
"[0-9]%": 匹配含有 形如 x% 的字符串
",[a-zA-Z0-9]$": 匹配以逗号再加一个数字或字母结尾的字符串
你也可以把你不想要得字符列在中括号里,你只需要在总括号里面使用'^' 作为开头 "%[^a-zA-Z]%" 匹配含有两个百分号里面有一个非字母的字符串.
要点:^用在中括号开头的时候,就表示排除括号里的字符
为了PHP能够解释,你必须在这些字符面前后加'',并且将一些字符转义.
不要忘记在中括号里面的字符是这条规路的例外—在中括号里面, 所有的特殊字符,包括(''), 都将失去他们的特殊性质 "[*+?{}.]"匹配含有这些字符的字符串.
还有,正如regx的手册告诉我们: "如果列表里含有 ']', 最好把它作为列表里的第一个字符(可能跟在'^'后面). 如果含有'-', 最好把它放在最前面或者最后面, or 或者一个范围的第二个结束点[a-d-0-9]中间的‘-’将有效.
看了上面的例子,你对{n,m}应该理解了吧.要注意的是,n和m都不能为负整数,而且n总是小于m. 这样,才能 最少匹配n次且最多匹配m次. 如"p{1,5}"将匹配 "pvpppppp"中的前五个p
下面说说以开头的
b 书上说他是用来匹配一个单词边界,就是...比如'veb',可以匹配love里的ve而不匹配very里有ve
B 正好和上面的b相反.例子我就不举了
好,我们来做个应用:
如何构建一个模式来匹配 货币数量 的输入
构建一个匹配模式去检查输入的信息是否为一个表示money的数字。我们认为一个表示money的数量有四种方式: "10000.00" 和 "10,000.00",或者没有小数部分, "10000" and "10,000". 现在让我们开始构建这个匹配模式:
^[1-9][0-9]*$
这是所变量必须以非0的数字开头.但这也意味着 单一的 "0" 也不能通过测试. 以下是解决的方法:
^(0│[1-9][0-9]*)$
"只有0和不以0开头的数字与之匹配",我们也可以允许一个负号在数字之前:
^(0│-?[1-9][0-9]*)$
这就是: "0 或者 一个以0开头 且可能 有一个负号在前面的数字." 好了,现在让我们别那么严谨,允许以0开头.现在让我们放弃 负号 , 因为我们在表示钱币的时候并不需要用到. 我们现在指定 模式 用来匹配小数部分:
^[0-9]+(.[0-9]+)?$
这暗示匹配的字符串必须最少以一个阿拉伯数字开头. 但是注意,在上面模式中 "10." 是不匹配的, 只有 "10" 和 "10.2" 才可以. (你知道为什么吗)
^[0-9]+(.[0-9]{2})?$
我们上面指定小数点后面必须有两位小数.如果你认为这样太苛刻,你可以改成:
^[0-9]+(.[0-9]{1,2})?$
这将允许小数点后面有一到两个字符. 现在我们加上用来增加可读性的逗号(每隔三位), 我们可以这样表示:
^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$
不要忘记 '+' 可以被 '*' 替代 如果你想允许空白字符串被输入话 (为什么?). 也不要忘记反斜杆 ’’ 在php字符串中可能会出现错误 (很普遍的错误).
现在,我们已经可以确认字符串了, 我们现在把所有逗号都去掉 str_replace(",", "", $money) 然后在把类型看成 double然后我们就可以通过他做数学计算了.
再来一个:
构造检查email的正则表达式
在一个完整的email地址中有三个部分:
1. 用户名 (在 '@' 左边的一切),
2.'@',
3. 服务器名(就是剩下那部分).
用户名可以含有大小写字母阿拉伯数字,句号 ('.'), 减号('-'), and 下划线 ('_'). 服务器名字也是符合这个规则,当然下划线除外.
现在, 用户名的开始和结束都不能是句点. 服务器也是这样. 还有你不能有两个连续的句点他们之间至少存在一个字符,好现在我们来看一下怎么为用户名写一个匹配模式:
^[_a-zA-Z0-9-]+$
现在还不能允许句号的存在. 我们把它加上:
^[_a-zA-Z0-9-]+(.[_a-zA-Z0-9-]+)*$
上面的意思就是说: "以至少一个规范字符(除了.)开头,后面跟着0个或者多个以点开始的字符串."
简单化一点, 我们可以用 eregi()取代 ereg().eregi()对大小写不敏感, 我们就不需要指定两个范围 "a-z" 和 "A-Z" – 只需要指定一个就可以了:
^[_a-z0-9-]+(.[_a-z0-9-]+)*$
后面的服务器名字也是一样,但要去掉下划线:
^[a-z0-9-]+(.[a-z0-9-]+)*$
好. 现在只需要用”@”把两部分连接:
^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*$
这就是完整的email认证匹配模式了,只需要调用
eregi(‘^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*$ ’,$email)
就可以得到是否为email了
正则表达式的其他用法
提取字符串
ereg() and eregi() 有一个特性是允许用户通过正则表达式去提取字符串的一部分(具体用法你可以阅读手册). 比如说,我们想从 path/URL 提取文件名 – 下面的代码就是你需要:
ereg("([^/]*)$", $pathOrUrl, $regs);
echo $regs[1];
高级的代换
ereg_replace() 和 eregi_replace()也是非常有用的: 假如我们想把所有的间隔负号都替换成逗号:
ereg_replace("[ nrt]+", ",", trim($str));
最后,我把另一串检查EMAIL的正则表达式让看文章的你来分析一下.
"^[-!#$%&'*+./0-9=?A-Z^_`a-z{|}~]+'.'@'.'[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+.'.'[-!#$%&'*+./0-9=?A-Z^_`a-z{|}~]+$"
如果能方便的读懂,那这篇文章的目的就达到了.
这篇文章我是在网上找到的...关于正则表达式我也只看过这篇文章...觉得还行看完以后简单的正则表达式还是能看懂的。
❽ php 正则表达式
建议你到我的网站上下载PHP5参考手册,里边有详细的正则表达式的参考。
模式要有开始和结束的字符,一下都是合法的:
/
|
#
'
前提是模式中不能再出现这个字符了。
结尾的/后边的is是模式修政府,具体如下
i (PCRE_CASELESS)
如果设定此修正符,模式中的字符将同时匹配大小写字母。
m(PCRE_MULTILINE)
默认情况下,PCRE 将目标字符串作为单一的一“行”字符所组成的(甚至其中包含有换行符也是如此)。“行起始”元字符(^)仅仅匹配字符串的起始,“行结束”元字符($)仅仅匹配字符串的结束,或者最后一个字符是换行符时其前面(除非设定了 D 修正符)。这和 Perl 是一样的。
当设定了此修正符,“行起始”和“行结束”除了匹配整个字符串开头和结束外,还分别匹配其中的换行符的之后和之前。这和 Perl 的 /m 修正符是等效的。如果目标字符串中没有“\n”字符或者模式中没有 ^ 或 $,则设定此修正符没有任何效果。
s(PCRE_DOTALL)
如果设定了此修正符,模式中的圆点元字符(.)匹配所有的字符,包括换行符。没有此设定的话,则不包括换行符。这和 Perl 的 /s 修正符是等效的。排除字符类例如 [^a] 总是匹配换行符的,无论是否设定了此修正符。
x(PCRE_EXTENDED)
如果设定了此修正符,模式中的空白字符除了被转义的或在字符类中的以外完全被忽略,在未转义的字符类之外的 # 以及下一个换行符之间的所有字符,包括两头,也都被忽略。这和 Perl 的 /x 修正符是等效的,使得可以在复杂的模式中加入注释。然而注意,这仅适用于数据字符。空白字符可能永远不会出现于模式中的特殊字符序列,例如引入条件子模式的序列 (?( 中间。
e
如果设定了此修正符,preg_replace() 在替换字符串中对逆向引用作正常的替换,将其作为 PHP 代码求值,并用其结果来替换所搜索的字符串。
只有 preg_replace() 使用此修正符,其它 PCRE 函数将忽略之。
注意: 本修正符在 PHP3 中不可用。
A(PCRE_ANCHORED)
如果设定了此修正符,模式被强制为“anchored”,即强制仅从目标字符串的开头开始匹配。此效果也可以通过适当的模式本身来实现(在 Perl 中实现的唯一方法)。
D(PCRE_DOLLAR_ENDONLY)
如果设定了此修正符,模式中的美元元字符仅匹配目标字符串的结尾。没有此选项时,如果最后一个字符是换行符的话,美元符号也会匹配此字符之前(但不会匹配任何其它换行符之前)。如果设定了 m 修正符则忽略此选项。Perl 中没有与其等价的修正符。
S
当一个模式将被使用若干次时,为加速匹配起见值得先对其进行分析。如果设定了此修正符则会进行额外的分析。目前,分析一个模式仅对没有单一固定起始字符的 non-anchored 模式有用。
U(PCRE_UNGREEDY)
本修正符反转了匹配数量的值使其不是默认的重复,而变成在后面跟上“?”才变得重复。这和 Perl 不兼容。也可以通过在模式之中设定 (?U) 修正符或者在数量符之后跟一个问号(如 .*?)来启用此选项。
X(PCRE_EXTRA)
此修正符启用了一个 PCRE 中与 Perl 不兼容的额外功能。模式中的任何反斜线后面跟上一个没有特殊意义的字母导致一个错误,从而保留此组合以备将来扩充。默认情况下,和 Perl 一样,一个反斜线后面跟一个没有特殊意义的字母被当成该字母本身。当前没有其它特性受此修正符控制。
u(PCRE_UTF8)
此修正符启用了一个 PCRE 中与 Perl 不兼容的额外功能。模式字符串被当成 UTF-8。本修正符在 Unix 下自 PHP 4.1.0 起可用,在 win32 下自 PHP 4.2.3 起可用。自 PHP 4.3.5 起开始检查模式的 UTF-8 合法性。
❾ PHP函数preg_match_all正则表达式的基本使用详细解析
了解正则表达式之前,须要掌握一些常用的正则表达式的基础知识,这些如果能记得最好记得,记不住须要用的时候能查到就行,就多个特殊字符,所以说正则表达式玩的就是特殊,具体大家可以查看更加细致的说明。
preg_match_all函数具体说明大家可以查看PHP手册,本文运用
preg_match_all用于测试正则表达的效果。
实例代码:
复制代码
代码如下:
$html
=
'<div
id="biuuu">jb51.net</div><div
id="biuuu_2">jb51.net2</div><div
id="biuuu_3">jb51.net3</div>';
实例要求:分别将每一个DIV元素的ID和内容取出,如biuuu,biuuu_2,biuuu_3,jb51.net,jb51.net2和jb51.net3(一些常用的抓站要领就是这样匹配的)
分析:字符串是一个基本的HTML元素,每一个DIV元素对应该一个ID和内容,并且是独立的,首先考虑如何
取出一个DIV内的ID值和内容,如:jb51.net,然后匹配其它类似的元素。一个DIV中须要取出两个值,也就是两个匹配的表达式,第一个表达式用于匹配ID值(biuuu),第二个表达式用于匹配ID的内容(jb51.net),正则表达式常用的表达式运用小括号,那么前面的元素将会变成如下形式:
<div
id="(biuuu)">(jb51.net)</div>
<div
id="(表达式1)">(表达式2)</div>
好,运用如上小括号把须要匹配的区域执行
了划分,接下来就是如何
匹配各个表达式内的内容,我们猜想一个ID可能是字母,数字或下划线,那这就变得基本了,运用中括号就可以实现,如下:
表达式1:[a-zA-Z0-9_]+
(表示匹配大小写字母,数字和下划线)
那如何
匹配表达式2,因为ID的内容可以是任意的字符,但是要留心,不能匹配<或>字符,因为如果匹配这两个字符将会把后面运用的DIV都匹配出来,因此须要排除这两个字符开始的元素,也就是不匹配以<或>字符,如下:
表达式2:[^<>]+
(表示不匹配<和>字符)
这样,须要匹配的子表达式就实现了,但是还要须要匹配一个
的表达式,要领如下:
表达式:/
'\"(表达式1)\"'>(表达式2)<\/div>/
留心其中的双引号"和/须要运用
\转义字符转义,然后把前面两个表达式放进去,
如下:
'\"([a-z0-9_]+)\"'>/<div
id=\"([a-z0-9_]+)\">([^<>]+)<\/div>/
这样就实现一个匹配每一个DIV元素ID值和内容的正则表达式,然后运用
preg_match_all函数测试如下:
复制代码
代码如下:
$html
=
'<div
id="biuuu">jb51.net</div><div
id="biuuu_2">jb51.net2</div><div
id="biuuu_3">jb51.net3</div>';
preg_match_all('/<div\sid=\"([a-z0-9_]+)\">([^<>]+)<\/div>/',$html,$result);
var_mp($result);
结果:
复制代码
代码如下:
array(3)
{
[0]=>
array(3)
{
[0]=>
string(30)
"<div
id="biuuu">jb51.net</div>"
[1]=>
string(33)
"<div
id="biuuu_2">jb51.net2</div>"
[2]=>
string(33)
"<div
id="biuuu_3">jb51.net3</div>"
}
[1]=>
array(3)
{
[0]=>
string(5)
"biuuu"
[1]=>
string(7)
"biuuu_2"
[2]=>
string(7)
"biuuu_3"
}
[2]=>
array(3)
{
[0]=>
string(8)
"jb51.net"
[1]=>
string(9)
"jb51.net2"
[2]=>
string(9)
"jb51.net3"
}
}
共有三个表达式,分别显示每一个表达式匹配的值,并以数组的形式存储,这样就把每一个DIV元素的ID和内容取出。运用正则表达式最主要还是要知道须要什么,然后跟椐须要执行
匹配,并且思路清晰,并适当的借助preg_match_all函数执行
输出调试,非常方便。