php正则表达式概述
^[]和[^ ]的区别
• 你也可以把你不想要得字符列在中括号里,你只 需要在总括号里面使用'^' 作为开头 "%[^a-zAZ]%" 匹配含有两个百分号里面有一个非字母的 字符串. • 要点:^用在中括号开头的时候,就表示排除括号里 的字符 • 不要忘记在中括号里面的字符是这条规路的例外 —在中括号里面, 所有的特殊字符,包括(''), 都 将失去他们的特殊性质 "[*\+?{}.]"匹配含有这 些字符的字符串.
圆括号()
1.正则表达式中的圆括号的作用是对字符进行分组,并保存匹配的文本。 2.圆括号用法I:对字符或元字符进行分组,这样在圆括号内就可以对字 符组合使用限定符。 匹配A+一个数字+A+一个数字:(A\d){2} 3.圆括号用法II:表示可选择性。 3.1 从两个直接量中选择一个 gr(a|e)y匹配gray和grey,该例子还可以使用gr[ae]y,字符类效率 更高。 3.2 从多个直接量中选择 (Doctor|Dr\.?)匹配Doctor,Dr,Dr.三种情况 3.3 错误匹配的交替行为, 使用交替行为时,有时会出现意想不到的错误。 用(a|ab)匹配ab时,只能匹配a,但是如果用(ab|a),则可以匹配ab
例题test.php
• • • • • • • • • • • • • • • • • <meta http-equiv="Content-Type" content="text/html; charset=GBK"> <style> h1{ color:#F00;} b{color:#00f;} </style> <?php $string = $_GET['pattern']; $email=$string; if(ereg ("^[a-zA-Z][0-9a-zA-Z_]{1,4}@[0-9a-zA-Z_]{1,10}(\.)(com|cn||net)$",$email)) { echo "<font >"."<b><h1>{$string}</h1></b><b>email格式正确</b>!!"."<font>"; } else{ echo "<font >"."电子邮件地址<b><h1>{$string}</h1></b>不正确!!"."<font>"; }
―或”符号
• 句点和方括号只匹配单个字符,如果要匹配多个字符就要 看”或”运算符了 • 如果除了上面匹配的所有单词之外,你还想要匹配 “toon‖,那么,你可以使用“|‖操作符。“|‖操作符的 基本意义就是“或”运算。要匹配“toon‖,使用 “t(a|e|i|o|oo)n‖正则表达式。这里不能使用方扩号, 因为方括号只允许匹配单个字符;这里必须使用圆括号 “()‖。圆括号还可以用来分组,具体请参见后面介绍。
从邮件验证说起
• • • • 邮件的格式: sun@ 其中sun是用户名,是服务器名 用户名只能由英文字母a~z(不区分大小写)、数字0~9 、下划线组成。 • 用户名的起始字符必须是英文字母.如:netease_2005 • 用户名长度为5~20个字符。 • 服务器名只能由英文字母a~z(不区分大小写)、数字0~ 9、下划线及点组成,@后点前面长度限制为1-10个字符, 点后面的限制为com,cn,,net。
正则表达式本质
一、正则表达式也是一个字符串 二、由具有特殊意义的字符组成的字符串 三、具有一点编写规则,也是一种模式 四、看作是一种编程语言(是用一些特殊字符,按规则编写 出一个字符串,形成一种模式---正则表达式)
• 注意: 如果正则表达式,不和函数一起使用,则它就是 一个字符串,如果将正则表达式放到到某个函数中使用, 才能发挥出正则表达式的作用。 • * * 在PHP中给我们提供两套正则表达式函数库 • POSIX 扩展正则表达式函数(ereg_) • Perl 兼容正则表达式函数(preg_)
从邮件验证说起
• • • • 先写用户名的正则表达式 ^[a-zA-Z][0-9a-zA-Z_]{1,} 再写主机名的正则表达式 [0-9a-zAZ_]{1,10}(\.)(com|cn||net)$ • 再把前后拼起来则为: • ^[a-zA-Z][0-9a-zA-Z_]{1,}@[0-9a-zAZ_]{1,10}(\.)(com|cn||net)$
方括号符号
句点优点是通用,同时缺点也是通用 为了解决句点符号匹配范围过于广泛这一问题,你可以在 方括号(“[]‖)里面指定看来有意义的字符。此时,只 有方括号里面指定的字符才参与匹配。也就是说,正则表 达式“t[aeio]n‖只匹配“tan‖、“Ten‖、“tin‖ 匹配单个字符 .方括号表示可能出现的单个字符
Lamp-正则表达式
网络技术系 施艳昭
正则表达式,有两方面需要学习:
• 一、正则表达式的模式如何编写 主要是语法规则 • 二、学习正则表达式的强大处理函数
正则简介
• 目前,正则表达式已经在很多软件中得到广泛的 应用,包括*nix(Linux, Unix等),HP等操作 系统,PHP,C#,Java等开发环境,以及很多 的应用软件中,都可以看到正则表达式的影子。 • • 正则表达式也称为一种模式表达式。通过构建具 有特定规则的模式,与输入的字符信息比较。再 进行分割、匹配、查找、替换等工作 。 • "/\<img\s*src=\".*?\"\/\>/"
{}
你也可以在大括号里面限制字符出现的个数,比如 • "ah{2}": 要求a后面一定要跟两个h(一个也不 能少)("ahh"); • "ah{2,}": 要求a后面一定要有两个或者两个以 上h(如"ahh", "ahhhh", 等.); • "ah{3,5}": 要求a后面可以有3-5个h("ahhh", "ahhhh", or "ahhhhh").
^ 和 $
• 看到前面的邮件验证大部分人可能会感到头痛,别急下面我 们慢慢分解 • ^ 和 $ 他们是分别用来匹配字符串的开始和结束,下面法 举例说明 • "^The": 开头一定要有"The"字符串; • "of despair$": 结尾一定要有"of despair" 的字符串; 那 么, • "^abc$": 就是要求以abc开头和以abc结尾的字符串,实 际上是只有abc匹配 • "notice": 匹配包含notice的字符串 你可以看见如果你没有 用我们提到的两个字符(最后一个例子),就是说 模式( 正则表达式) 可以出现在被检验字符串的任何地方,你没 有把他锁定到两边 (开始或结束)
'*', '+',和 '?',
'*', '+',和 '?', 他们用来表示一个字符可以出现的次数或者 顺序. 他们分别表示: * 表示出现0次或1次或多次 相当于{0,}, + 表示出现1次或多次 相当于{1,}, ? 表示出现0次或1次 相当于{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结尾 的字符串. 要点, '*', '+',和 '?'只管它前面那个字符.
• 正确的是:
图:匹配所有123-12-1234形式的社会安全号码
实例2
• 假设进行搜索的时候,你希望连字符号可以出现,也可以 不出现——即,999-99-9999和999999999都属于正 确的格式。这时,你可以在连字符号后面加上一个数量限 定符号,如图所示:
正则表达式的历史
•
正则表达式的“祖先”可以一直上溯至对人类神经系统如何工作 的早期研究。Warren McCulloch 和 Walter Pitts 这两位神经生理 学家研究出一种数学方式来描述这些神经网络。 • 1956 年, 一位叫 Stephen Kleene 的数学家在 McCulloch 和 Pitts 早期工作的基础上,发表了一篇标题为“神经网事件的表示法 ”的论文,引入了正则表达式的概念。正则表达式就是用来描述他称 为“正则集的代数”的表达式,因此采用“正则表达式”这个术语。 • 随后,发现可以将这一工作应用于使用 Ken Thompson 的计算 搜索算法的一些早期研究,Ken Thompson 是 Unix 的主要发明人 。正则表达式的第一个实用应用程序就是 Unix 中的 qed 编辑器。 如他们所说,剩下的就是众所周知的历史了。从那时起直至现在正则 表达式都是基于文本的编辑器和搜索工具中的一个重要部分。
'.'
• 一个点('.')可以代表所有的单一字符,不包括"\n" • 如果,要匹配包括"\n"在内的所有单个字符,怎么 办? • 用'[\n.]'这种模式. • "a.[0-9]": 一个a加一个字符再加一个0到9的数 字 • ".{3}$": 三个任意字符结尾 .