首页
关于
Search
1
给你10个市场数据调研报告的免费下载网站!以后竞品数据就从这里找!
135 阅读
2
php接口优化 使用curl_multi_init批量请求
129 阅读
3
2024年备考系统架构设计师
102 阅读
4
《从菜鸟到大师之路 ElasticSearch 篇》
101 阅读
5
PHP 文件I/O
89 阅读
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
登录
Search
标签搜索
php函数
php语法
性能优化
安全
错误和异常处理
问题
vue
Composer
Session
缓存
框架
Swoole
api
并发
异步
正则表达式
php-fpm
mysql 索引
开发规范
协程
dafenqi
累计撰写
785
篇文章
累计收到
4
条评论
首页
栏目
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
副业
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
页面
关于
搜索到
785
篇与
的结果
2023-08-07
十个PHP高级应用技巧
1.使用 ip2long() 和 long2ip() 函数来把 IP 地址转化成整型存储到数据库里。这种方法把存储空间降到了接近四分之一(char(15) 的 15 个字节对整形的 4 个字节),计算一个特定的地址是不是在一个区段内页更简单了,而且加快了搜索和排序的速度(虽然有时仅仅是快了一点)。 2.在验证 email 地址的时候使用 checkdnsrr() 函数验证域名是否存在。这个内置函数能够确认指定的域名能够解析成 IP 地址。该函数的PHP 文档的用户评论部分有一个简单的用户自定义函数,这个函数基于 checkdnsrr(),用来验证 email 地址的合法性。对于那些认为自己的 email 地址是 [url=mailto:“joeuser@wwwphp.net]“joeuser@wwwphp.net[/url]” 而不是 [url=mailto:“joeuser@php.net]“joeuser@php.net[/url]” 的家伙们,这个方法可以很方便的抓住他们。3.如果你使用的是 PHP 5 和 MySQL 4.1 或者更高的版本,考虑抛弃 mysql_ 系列函数改用改进版的 mysqli_ 系列函数。一个很好的功能就是你可以使用预处理语句,如果你在维护一个数据库密集型站点,这个功能能够加快查询速度。一些评估分数。4.学会爱上三元运算符。5.如果你在项目中感觉到有可复用的部分,在你写下一行代码前先看看 PEAR 中是否已经有了。很多 PHP 程序员都知道 PEAR 是一个很好的资源库,虽然还有很多程序员不知道。这个在线资源库包含了超过 400 个可以复用的程序片段,这些程序片段你可以立即用刀你的程序里。除非说你的项目真的是非常特别的,你总能找到帮你节省时间的 PEAR 包。(参见 PECL )6.用 highlight_file() 来自动的打印出格式化的很漂亮的源代码。如果你在留言板、IRC 这些地方寻求一个脚本的帮助的话,这个函数用起来非常的顺手。当然了,要小心不要意外的泄露出你的数据库连接信息和密码等。7.使用 error_reporting(0) 函数来防止用户看到潜在的敏感错误信息。在理想情况下,发布服务器应该在 php.ini 里完全禁止。但是如果你用的是一个共享的 web 服务器的话,你没有自己的 php.ini 文件,那么这种情况下你最好的选择就是在所有脚本的第一行前加上 error_reporting(0);(或者使用 require_once() 方法)。这就能够在出错的时候完全屏蔽敏感的 SQL 查询语句和路径名。8.在网数据库中存储很大的字符串之前使用 gzcompress() 和 gzuncompress() 来显式的压缩/解压字符串。这个 PHP 内置函数使用 gzip 算法,可以压缩普通文本达 90%。在我每次要读写 BLOB 类型的字段的时候都使用这些函数。唯一额例外就是当我需要全文检索的时候。9.通过“引用”传递参数的方法从一个函数中得到多个返回值。就像三元运算符一样,大部分受过正式编程训练的程序员都知道这个技巧。但是那些 HTML 背景大于 Pascal 背景的程序员都或多或少的有过这样的疑问“在仅能使用一次 return 的情况下,从一个函数里返回多个值?”答案就是在变量前加上一个 “&” 符号,通过“引用”传递而非“值”传递。10.完全理解“魔术引号”和 SQL 注入的危险性。我希望阅读到这里的开发者都已经很对 SQL 注入和了解了。不过我还是把这条列在这里,是因为这个确实有点难以理解。如果你还没有听说过这种说法,那么把今天剩下的时间都用来 Google、阅读吧。
2023年08月07日
17 阅读
0 评论
0 点赞
2023-08-07
使用file_get_contents提交http post
使用file_get_contents提交http post我曾经发过一篇讲使用curl获取需要登陆内容的文章,但其实,自5.0开始,使用file_get_contents就可以完成.(前提是开启了allow_url_fopen),下面以一个简单的例子说明一下:1.先看一下目标网页(假设是http://localhost/response.php)response.php以下是代码片段:<?phpecho "";print_r($_POST);print_r($_COOKIE);?>本文讲述的只是http post请求的发送,所以,目标页只是回显所收到的post和cookie2.请求页request.php以下是代码片段:<?php$data = array("name" => 'tim',"content" => 'test');$data = http_build_query($data);$opts = array('http'=>array('method'=>"POST",'header'=>"Content-type: application/x-www-form-urlencoded\r\n"."Content-length:".strlen($data)."\r\n" ."Cookie: foo=bar\r\n" ."\r\n",'content' => $data,));$cxContext = stream_context_create($opts);$sFile = file_get_contents("http://localhost/response.php", false, $cxContext);echo $sFile;?>这个文件首先使用stream_context_create()构造了一个http请求,然后使用file_get_contents发送出去,返回的结果是:以下是代码片段:Array([name] => tim[content] => test)Array([foo] => bar)所以上可以看出,只要你了解http协议,完全可以使用这两个函数构造出所有正常的http请求,比如代理,断点续传等...对照之前的关于curl的文章,就可以用来取得需要用户验证的内容了.
2023年08月07日
13 阅读
0 评论
0 点赞
2023-08-07
关于session和memcache的若干问题
关于session和memcache的若干问题一直以来,由于php本身的session机制不能跨机,令很多phper感到不爽,现在流行的解决方案主要有:1)使用数据库来实现2)自己写server端,通过改写session处理函数来请求3)使用nfs等跨机存储来保存session4)使用memcache来保存5)使用zend platform提供的解决方案其中的1-4都是通过改用可以跨机的储存机制,再使用session_set_save_handler()来实现,5是zend公司的商业产品(不过据之前在使用的同事反映,效果不太满意),以上的方案,各有利弊,不在本文讨论范围无论是用memcache,还是db,nfs,其原理是一样的,都是通过session_set_save_handler函数来改变默认的处理方式,通过指定回调函数来自定义处理,可以参考手册的session_set_save_handler()函数部分,有例子,比较容易明白以下是一些我在使用memcache来实现时的一些记录:1)使用类来实现时,各回调函数都定义为静态方法,在类的构造中使用session_set_save_handler注册回调函数, 如:session_set_save_handler(array(\'memSession\', \'open\'),array(\'memSession\', \'close\'),array(\'memSession\', \'read\'),array(\'memSession\', \'write\'),array(\'memSession\', \'destroy\'),array(\'memSession\', \'gc\'));memSession为类名,要使用session,则先new memSession,再session_start();2)生存期和垃圾回收memCache的set命令有生存期,即使用set命令添加值时,可加上lifetime,此时间可以作为session的生存期,用户在此时间内没有动作,则会失效,但有动作则不会失效(因为每一个脚本结束时,都会执行write和close,此时lifetime就会被更新了),当然,如果使用cookie传递SID,则控制SESSION生存期可以用:ini_set(\'session.cookie_lifetime\',time)来设定,这其实是控制cookie的有效时间,如果session赖以生存的cookie消失了,当然session也就活不了,使用cookie_lifetime来控制的话,无论有无动作,都将在指定的时间后过时gc是指垃圾回收,在session中是指清理过期的session数据,影响的参数有:session.gc_maxlifetime 被视为垃圾前的生存期,超过此时间没有动作,数据会被清走注意的是,gc不是每次启动会话都会被执行,而是由session.gc_probability 和 session.gc_divisor的比率决定的结论:控制SESSION的生存期有几种方法一是cookie_lifttime,这种方式无论有无动作,都会在指定时间内销毁二是在read中根椐保存时间控制,此方法在有动作时时间会一直有效三设定session.gc_probability 和 session.gc_divisor的比率为1(即每次会话都会启用gc),再设定gc.maxlifetime来指定生存期,此方法也是在用户有动作时时间一直有效3)回调函数的执行时机open 在运行session_start()时执行read 在运行session_start()时执行,因为在session_start时,会去read当前session数据并写入$_SESSION变量destroy 在运行session_destroy()时执行close 在脚本执行完成或调用session_write_close() 或 session_destroy()时被执行,即在所有session操作完成后被执行gc 执行概率由session.gc_probability 和 session.gc_divisor的值决定,时机是在open,read之后,即session_start会相继执行open,read和gcwrite 此方法在脚本结束和使用session_write_close()强制提交SESSION数据时执行结论:session_start //执行open(启动会话),read(读取session数据至$_SESSION),gc(清理垃圾)脚本中间所有对$_SESSION的操作均不会调用这些回调函数session_destroy //执行destroy,销毁当前session(一般是删除相应的记录或文件),相应地,此回调函数销毁的只是session的数据,但此时var_dump一下$_SESSION变量,仍然有值的,但此值不会在close后被write回去session_write_close() //执行write和close,保存$_SESSION至存储,如不手工使用此方法,则会在脚本结束时被自动执行清晰了以上信息,将对你清楚了解SESSION的工作原理有很大的帮助...4)直接使用memcache作session处理在我写了一系列的memcache来保存session的代码后,无意中发现,可以直接在php.ini中设定使用memcache作为session处理,而无须另外编码,方法是:修改php.ini中的以下值session.save_handler = memcachesession.save_path = \'tcp://host1:11211\' #有多个时直接用","分隔即可如果只想在特定的应用里使用memcache储存session,可以使用ini_set的方法对以上两个参数进行设定要测试一下是否真正用上了memcache,可以先捕足到使用的PHPSESSID,再作为KEY用memcach去读一下,就清楚了
2023年08月07日
15 阅读
0 评论
0 点赞
2023-08-07
php 的正则表达式完全手册
php 的正则表达式完全手册前言正则表达式是烦琐的,但是强大的,学会之后的应用会让你除了提高效率外,会给你带来绝对的成就感。只要认真去阅读这些资料,加上应用的时候进行一定的参考,掌握正则表达式不是问题。索引1._引子2._正则表达式的历史3._正则表达式定义3.1_普通字符3.2_非打印字符3.3_特殊字符3.4_限定符3.5_定位符3.6_选择3.7_后向引用4._各种操作符的运算优先级5._全部符号解释6._部分例子7._正则表达式匹配规则7.1_基本模式匹配7.2_字符簇7.3_确定重复出现引子目前,正则表达式已经在很多软件中得到广泛的应用,包括*nix(Linux, Unix 等) HP 等操作系统,,PHP,C#,Java 等开发环境,以及很多的应用软件中,都可以看到正则表达式的影子。正则表达式的使用,可以通过简单的办法来实现强大的功能。为了简单有效而又不失强大,造成了正则表达式代码的难度较大,学习起来也不是很容易,所以需要付出一些努力才行,入门之后参照一定的参考,使用起来还是比较简单有效的。例子: ^.+@.+\..+$这样的代码曾经多次把我自己给吓退过。可能很多人也是被这样的代码给吓跑的吧。继续阅读本文将让你也可以自由应用这样的代码。注意:这里的第 7 部分跟前面的内容看起来似乎有些重复,目的是把前面表格里的部分重新描述了一次,目的是让这些内容更容易理解。正则表达式的历史正则表达式的“祖先”可以一直上溯至对人类神经系统如何工作的早期研究。Warren McCulloch 和Walter Pitts 这两位神经生理学家研究出一种数学方式来描述这些神经网络。年, 一位叫 Stephen Kleene 的数学家在 McCulloch 和 Pitts 早期工作的基础上,发表了一篇标题为“神经网事件的表示法”的论文,引入了正则表达式的概念。正则表达式就是用来描述他称为“正则集的代数”的表达式,因此采用“正则表达式”这个术语。随后,发现可以将这一工作应用于使用 Ken Thompson 的计算搜索算法的一些早期研究, ThompsonKen是 Unix 的主要发明人。正则表达式的第一个实用应用程序就是 Unix 中的 qed 编辑器。如他们所说,剩下的就是众所周知的历史了。从那时起直至现在正则表达式都是基于文本的编辑器和搜索工具中的一个重要部分。正则表达式定义正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。列目录时,dir .txt 或 ls .txt 中的.txt 就不是一个正则表达式,因为这里与正则式的*的含义是不同的。正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。3.1 普通字符由所有那些未显式指定为元字符的打印和非打印字符组成。这包括所有的大写和小写字母字符,所有数字,所有标点符号以及一些符号。3.2 非打印字符字符 含义\cx 匹配由 x 指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。 的值必须为 A-Z 或 a-z 之x一。否则,将 c 视为一个原义的 'c' 字符。\f 匹配一个换页符。等价于 \x0c 和 \cL。\n 匹配一个换行符。等价于 \x0a 和 \cJ。\r 匹配一个回车符。等价于 \x0d 和 \cM。\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。\S 匹配任何非空白字符。等价于 1。\t 匹配一个制表符。等价于 \x09 和 \cI。\v 匹配一个垂直制表符。等价于 \x0b 和 \cK。3.3 特殊字符所谓特殊字符,就是一些有特殊含义的字符,如上面说的".txt"中的,简单的说就是表示任何字符串的意思。如果要查找文件名中有的文件,则需要对进行转义,即在其前加一个\。ls *.txt。正则表达式有以下特殊字符。特别字符 说明$ 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性, $ 也匹配 '\n' 或 '\r'。则要匹配 $ 字符本身,请使用 \$。( ) 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 ( 和)。匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 *。匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 +。. 匹配除换行符 \n 之外的任何单字符。要匹配 .,请使用 \。[ 标记一个中括号表达式的开始。要匹配 [,请使用 [。? 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 ?。\ 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, 'n' 匹配字符 'n'。'\n' 匹配换行符。序列 '\' 匹配 "\",而 '(' 则匹配 "("。^ 匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。要匹配 ^ 字符本身,请使用 ^。{ 标记限定符表达式的开始。要匹配 {,请使用 {。| 指明两项之间的一个选择。要匹配 |,请使用 |。构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与操作符将小的表达式结合在一起来创建更大的表达式。正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。3.4 限定符限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有*或+或?或{n}或{n,}或{n,m}共 6 种。*、+和?限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个?就可以实现非贪婪或最小匹配。正则表达式的限定符有:字符 描述匹配前面的子表达式零次或多次。例如,zo 能匹配 "z" 以及 "zoo"。 等价于{0,}。匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于{1,}。? 匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于{0,1}。{n} n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food"中的两个 o。{n,} n 是一个非负整数。至少匹配 n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood"中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。{n,m} m 和 n 均为非负整数,其中 n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配"fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。3.5 定位符用来描述字符串或单词的边界,^和$分别指字符串的开始与结束,\b 描述单词的前或后边界,\B 表示非单词边界。不能对定位符使用限定符。3.6 选择用圆括号将所有选择项括起来,相邻的选择项之间用|分隔。但用圆括号会有一个副作用,是相关的匹配会被缓存,此时可用?:放在第一个选项前来消除这种副作用。其中?:是非捕获元之一,还有两个非捕获元是?=和?!,这两个还有更多的含义,前者为正向预查,在任何开始匹配圆括号内的正则表达式模式的位置来匹配搜索字符串,后者为负向预查,在任何开始不匹配该正则表达式模式的位置来匹配搜索字符串。3.7 后向引用对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到一个临时缓冲区中,所捕获的每个子匹配都按照在正则表达式模式中从左至右所遇到的内容存储。存储子匹配的缓冲区编号从 1 开始,连续编号直至最大 99 个子表达式。每个缓冲区都可以使用 '\n' 访问,其中 n 为一个标识特定缓冲区的一位或两位十进制数。可以使用非捕获元字符 '?:', '?=', or '?!' 来忽略对相关匹配的保存。各种操作符的运算优先级相同优先级的从左到右进行运算,不同优先级的运算先高后低。各种操作符的优先级从高到低如下:操作符 描述\ 转义符(), (?:), (?=), [] 圆括号和方括号*, +, ?, {n}, {n,}, {n,m} 限定符^, $, \anymetacharacter 位置和顺序| “或”操作全部符号解释字符 描述\ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如,'n' 匹配字符 "n"。'\n' 匹配一个换行符。序列 '\' 匹配 "\" 而 "(" 则匹配 "("。^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置。$ 匹配输入字符串的结束位置。如果设置了 RegExp 对象的 Multiline 属性,$ 也匹配 '\n' 或 '\r' 之前的位置。匹配前面的子表达式零次或多次。例如,zo 能匹配 "z" 以及 "zoo"。 等价于{0,}。匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于{1,}。? 匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于{0,1}。{n} n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food"中的两个 o。{n,} n 是一个非负整数。至少匹配 n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood"中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。{n,m} m 和 n 均为非负整数,其中 n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配"fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。? 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。. 匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。(pattern) 匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在 VBScript中使用 SubMatches 集合,在 JScript 中则使用 $0„$9 属性。要匹配圆括号字符,请使用 '(' 或')'。(?:pattern) 匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 就是一个比'industry|industries' 更简略的表达式。(?=pattern) 正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。(?!pattern) 负向预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始x|y 匹配 x 或 y。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。[xyz] 字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。2 负值字符集合。匹配未包含的任意字符。例如, '3' 可以匹配 "plain" 中的'p'。[a-z] 字符范围。匹配指定范围内的任意字符。例如,'[a-z]' 可以匹配 'a' 到 'z' 范围内的任意小写字母字符。4 负值字符范围。匹配任何不在指定范围内的任意字符。例如,'4' 可以匹配任何不在 'a' 到'z' 范围内的任意字符。\b 匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。\B 匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。\cx 匹配由 x 指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。 的值必须为 A-Z 或 a-z 之x一。否则,将 c 视为一个原义的 'c' 字符。\d 匹配一个数字字符。等价于 [0-9]。\D 匹配一个非数字字符。等价于 5。\f 匹配一个换页符。等价于 \x0c 和 \cL。\n 匹配一个换行符。等价于 \x0a 和 \cJ。\r 匹配一个回车符。等价于 \x0d 和 \cM。\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。\S 匹配任何非空白字符。等价于 6。\t 匹配一个制表符。等价于 \x09 和 \cI。\v 匹配一个垂直制表符。等价于 \x0b 和 \cK。\w 匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。\W 匹配任何非单词字符。等价于 '7'。\xn 匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,'\x41' 匹配 "A"。'\x041' 则等价于 '\x04' & "1"。正则表达式中可以使用 ASCII 编码。.\num 匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,'(.)\1' 匹配两个连续的相同字符。\n 标识一个八进制转义值或一个向后引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为向后引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。\nm 标识一个八进制转义值或一个向后引用。如果 \nm 之前至少有 nm 个获得子表达式,则 nm 为向后引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的向后引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm。\nml 如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。\un 匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如, \u00A9 匹配版权符号(?)。部分例子正则表达式 说明/\b([a-z]+) \1\b/gi 一个单词连续出现的位置/(\w+)://(8+)(:\d)?(9)/ 将一个 URL 解析为协议、域、端口及相对路径/^(?:Chapter|Section) 1-9{0,1}$/ 定位章节的位置/[-a-z]/ A 至 z 共 26 个字母再加一个-号。/ter\b/ 可匹配 chapter,而不能 terminal/\Bapt/ 可匹配 chapter,而不能 aptitude/Windows(?=95 |98 |NT )/ 可匹配 Windows95 或 Windows98 或 WindowsNT,当找到一个匹配后,从 Windows后面开始进行下一次正则表达式匹配规则7.1 基本模式匹配一切从最基本的开始。模式,是正规表达式最基本的元素,它们是一组描述字符串特征的字符。模式可以很简单,由普通的字符串组成,也可以非常复杂,往往用特殊的字符表示一个范围内的字符、重复出现,或表示上下文。例如:^once这个模式包含一个特殊的字符^,表示该模式只匹配那些以 once 开头的字符串。例如该模式与字符串"once upon a time"匹配,与"There once was a man from NewYork"不匹配。正如如^符号表示开头一样,$符号用来匹配那些以给定模式结尾的字符串。bucket$这个模式与"Who kept all of this cash in a bucket"匹配,与"buckets"不匹配。字符^和$同时使用时,表示精确匹配(字符串与模式一样)。例如:^bucket$只匹配字符串"bucket"。如果一个模式不包括^和$,那么它与任何包含该模式的字符串匹配。例如:模式once与字符串There once was a man from NewYorkWho kept all of his cash in a bucket.是匹配的。在该模式中的字母(o-n-c-e)是字面的字符,也就是说,他们表示该字母本身,数字也是一样的。其他一些稍微复杂的字符,如标点符号和白字符(空格、制表符等),要用到转义序列。所有的转义序列都用反斜杠()打头。制表符的转义序列是:\t。所以如果我们要检测一个字符串是否以制表符开头,可以用这个模式:^\t类似的,用\n 表示“新行”,\r 表示回车。其他的特殊符号,可以用在前面加上反斜杠,如反斜杠本身用\表示,句号.用.表示,以此类推。7.2 字符簇在 INTERNET 的程序中,正规表达式通常用来验证用户的输入。当用户提交一个 FORM 以后,要判断输入的电话号码、地址、EMAIL 地址、信用卡号码等是否有效,用普通的基于字面的字符是不够的。所以要用一种更自由的描述我们要的模式的办法,它就是字符簇。要建立一个表示所有元音字符的字符簇,就把所有的元音字符放在一个方括号里:[AaEeIiOoUu]这个模式与任何元音字符匹配,但只能表示一个字符。用连字号可以表示一个字符的范围,如:[a-z] //匹配所有的小写字母[A-Z] //匹配所有的大写字母[a-zA-Z] //匹配所有的字母[0-9] //匹配所有的数字[0-9.-] //匹配所有的数字,句号和减号[ \f\r\t\n] //匹配所有的白字符同样的,这些也只表示一个字符,这是一个非常重要的。如果要匹配一个由一个小写字母和一位数字组成的字符串,比如"z2"、"t6"或"g7",但不是"ab2"、"r2d3" 或"b52"的话,用这个模式:^a-z$尽管[a-z]代表 26 个字母的范围,但在这里它只能与第一个字符是小写字母的字符串匹配。前面曾经提到^表示字符串的开头,但它还有另外一个含义。当在一组方括号里使用^是,它表示“非”或“排除”的意思,常常用来剔除某个字符。还用前面的例子,我们要求第一个字符不能是数字:^5[0-9]$这个模式与"&5"、"g7"及"-2"是匹配的,但与"12"、"66"是不匹配的。下面是几个排除特定字符的例子:4 //除了小写字母以外的所有字符10 //除了()(/)(^)之外的所有字符11 //除了双引号(")和单引号(')之外的所有字符特殊字符"." (点,句号)在正规表达式中用来表示除了“新行”之外的所有字符。所以模式"^.5$"与任何两个字符的、以数字 5 结尾和以其他非“新行”字符开头的字符串匹配。模式"."可以匹配任何字符串,除了空串和只包括一个“新行”的字符串。PHP 的正规表达式有一些内置的通用字符簇,列表如下:字符簇含义[[:alpha:]] 任何字母[[:digit:]] 任何数字[[:alnum:]] 任何字母和数字[[:space:]] 任何白字符[[:upper:]] 任何大写字母[[:lower:]] 任何小写字母[[:punct:]] 任何标点符号[[:xdigit:]] 任何 16 进制的数字,相当于[0-9a-fA-F]7.3 确定重复出现到现在为止,你已经知道如何去匹配一个字母或数字,但更多的情况下,可能要匹配一个单词或一组数字。一个单词有若干个字母组成,一组数字有若干个单数组成。跟在字符或字符簇后面的花括号({})用来确定前面的内容的重复出现的次数。字符簇 含义^[a-zA-Z_]$ 所有的字母和下划线^[[:alpha:]]{3}$ 所有的 3 个字母的单词^a$ 字母 a^a{4}$ aaaa^a{2,4}$ aa,aaa 或 aaaa^a{1,3}$ a,aa 或 aaa^a{2,}$ 包含多于两个 a 的字符串^a{2,} 如:aardvark 和 aaab,但 apple 不行a{2,} 如:baad 和 aaa,但 Nantucket 不行\t{2} 两个制表符.{2} 所有的两个字符这些例子描述了花括号的三种不同的用法。一个数字,{x}的意思是“前面的字符或字符簇只出现 x 次”;一个数字加逗号,{x,}的意思是“前面的内容出现 x 或更多的次数”;两个用逗号分隔的数字,{x,y}表示“前面的内容至少出现 x 次,但不超过 y 次”。我们可以把模式扩展到更多的单词或数字:^[a-zA-Z0-9_]{1,}$ //所有包含一个以上的字母、数字或下划线的字符串^[0-9]{1,}$ //所有的正数^-{0,1}[0-9]{1,}$ //所有的整数^-{0,1}[0-9]{0,}.{0,1}[0-9]{0,}$ //所有的小数最后一个例子不太好理解,是吗?这么看吧:与所有以一个可选的负号(-{0,1})开头(^)、跟着 0 个或更多的数字([0-9]{0,})、和一个可选的小数点(.{0,1})再跟上 0 个或多个数字([0-9]{0,}),并且没有其他任何东西($)。下面你将知道能够使用的更为简单的方法。特殊字符"?"与{0,1}是相等的,它们都代表着: 个或 1 个前面的内容” “前面的内容是可选的”“0或。所以刚才的例子可以简化为:^-?[0-9]{0,}.?[0-9]{0,}$特殊字符"*"与{0,}是相等的,它们都代表着“0 个或多个前面的内容”。最后,字符"+"与 {1,}是相等的,表示“1 个或多个前面的内容”,所以上面的 4 个例子可以写成:^[a-zA-Z0-9_]+$ //所有包含一个以上的字母、数字或下划线的字符串^[0-9]+$ //所有的正数^-?[0-9]+$ //所有的整数^-?[0-9].?[0-9]$ //所有的小数当然这并不能从技术上降低正规表达式的复杂性,但可以使它们更容易阅读。 \f\n\r\t\v ↩xyz ↩abc ↩a-z ↩0-9 ↩ \f\n\r\t\v ↩A-Za-z0-9_ ↩/: ↩# ↩\/^ ↩\"\' ↩
2023年08月07日
12 阅读
0 评论
0 点赞
2023-08-07
PHP正则表达式教程
PHP正则表达式教程1、入门简介简单的说,正则表达式是一种可以用于模式匹配和替换的强有力的工具,主要用于字符串的模式分割、匹配、查找及替换操作。我们可以在几乎所有的基于UNIX系统的工具中找到正则表达式的身影,例如,vi编辑器,Perl或PHP脚本语言,以及awk或sed shell程序等。此外,象JavaScript这种客户端的脚本语言也提供了对正则表达式的支持。由此可见,正则表达式已经超出了某种语言或某个系统的局限,成为人们广为接受的概念和功能。正则表达式可以让用户通过使用一系列的特殊字符构建匹配模式,然后把匹配模式与数据文件、程序输入以及WEB页面的表单输入等目标对象进行比较,根据比较对象中是否包含匹配模式,执行相应的程序。举例来说,正则表达式的一个最为普遍的应用就是用于验证用户在线输入的邮件地址的格式是否正确。如果通过正则表达式验证用户邮件地址的格式正确,用户所填写的表单信息将会被正常处理;反之,如果用户输入的邮件地址与正则表达的模式不匹配,将会弹出提示信息,要求用户重新输入正确的邮件地址。由此可见正则表达式在WEB应用的逻辑判断中具有举足轻重的作用。使用正则表达式在某些简单的环境下可能效率不高,因此如何更好的使用PHP正则表达式需要综合考虑。2、基本语法在对正则表达式的功能和作用有了初步的了解之后,我们就来具体看一下正则表达式的语法格式。正则表达式的形式一般如下:/love/其中位于“/”定界符之间的部分就是将要在目标对象中进行匹配的模式。用户只要把希望查找匹配对象的模式内容放入“/”定界符之间即可。在对正则表达式的功能和作用有了初步的了解之后,我们就来具体看一下正则表达式的语法格式。 正则表达式的形式一般如下: /love/ 其中位于“/”定界符之间的部分就是将要在目标对象中进行匹配的模式。用户只要把希望查找匹配对象的模式内容放入“/”定界符之间即可。为了能够使用户更加灵活的定制模式内容,正则表达式提供了专门的“元字符”。所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。 较为常用的元字符包括: “+”, “”,以及 “?”。其中,“+”元字符规定其前导字符必须在目标对象中连续出现一次或多次,“”元字符规定其前导字符必须在目标对象中出现零次或连续多次,而“?”元字符规定其前导对象必须在目标对象中连续出现零次或一次。 下面,就让我们来看一下正则表达式元字符的具体应用。 /fo+/ 因为上述正则表达式中包含“+”元字符,表示可以与目标对象中的 “fool”, “fo”, 或者 “football”等在字母f后面连续出现一个或多个字母o的字符串相匹配。 /eg*/ 因为上述正则表达式中包含“*”元字符,表示可以与目标对象中的 “easy”, “ego”, 或者 “egg”等在字母e后面连续出现零个或多个字母g的字符串相匹配。 /Wil?/ 因为上述正则表达式中包含“?”元字符,表示可以与目标对象中的 “Win”, 或者 “Wilson”,等在字母i后面连续出现零个或一个字母l的字符串相匹配。 除了元字符之外,用户还可以精确指定模式在匹配对象中出现的频率。例如, /jim{2,6}/ 上述正则表达式规定字符m可以在匹配对象中连续出现2-6次,因此,上述正则表达式可以同jimmy或jimmmmmy等字符串相匹配。 在对如何使用正则表达式有了初步了解之后,我们来看一下其它几个重要的元字符的使用方式。 \s:用于匹配单个空格符,包括tab键和换行符; \S:用于匹配除单个空格符之外的所有字符; \d:用于匹配从0到9的数字; \w:用于匹配字母,数字或下划线字符; \W:用于匹配所有与\w不匹配的字符; . :用于匹配除换行符之外的所有字符。 (说明:我们可以把\s和\S以及\w和\W看作互为逆运算) 下面,我们就通过实例看一下如何在正则表达式中使用上述元字符。 /\s+/ 上述正则表达式可以用于匹配目标对象中的一个或多个空格字符。 /\d000/ 如果我们手中有一份复杂的财务报表,那么我们可以通过上述正则表达式轻而易举的查找到所有总额达千元的款项。 除了我们以上所介绍的元字符之外,正则表达式中还具有另外一种较为独特的专用字符,即定位符。定位符用于规定匹配模式在目标对象中的出现位置。 较为常用的定位符包括: “^”, “$”, “\b” 以及 “\B”。其中,“^”定位符规定匹配模式必须出现在目标字符串的开头,“$”定位符规定匹配模式必须出现在目标对象的结尾,\b定位符规定匹配模式必须出现在目标字符串的开头或结尾的两个边界之一,而“\B”定位符则规定匹配对象必须位于目标字符串的开头和结尾两个边界之内,即匹配对象既不能作为目标字符串的开头,也不能作为目标字符串的结尾。同样,我们也可以把“^”和“$”以及“\b”和“\B”看作是互为逆运算的两组定位符。举例来说: /^hell/ 因为上述正则表达式中包含“^”定位符,所以可以与目标对象中以 “hell”, “hello”或 “hellhound”开头的字符串相匹配。 /ar$/ 因为上述正则表达式中包含“$”定位符,所以可以与目标对象中以 “car”, “bar”或 “ar” 结尾的字符串相匹配。 /\bbom/ 因为上述正则表达式模式以“\b”定位符开头,所以可以与目标对象中以 “bomb”, 或 “bom”开头的字符串相匹配。 /man\b/ 因为上述正则表达式模式以“\b”定位符结尾,所以可以与目标对象中以 “human”, “woman”或 “man”结尾的字符串相匹配。 为了能够方便用户更加灵活的设定匹配模式,正则表达式允许使用者在匹配模式中指定某一个范围而不局限于具体的字符。例如: /[A-Z]/ 上述正则表达式将会与从A到Z范围内任何一个大写字母相匹配。 /[a-z]/ 上述正则表达式将会与从a到z范围内任何一个小写字母相匹配。 /[0-9]/ 上述正则表达式将会与从0到9范围内任何一个数字相匹配。 /(a-z[0-9])+/ 上述正则表达式将会与任何由字母和数字组成的字符串,如 “aB0” 等相匹配。这里需要提醒用户注意的一点就是可以在正则表达式中使用 “()” 把字符串组合在一起。“()”符号包含的内容必须同时出现在目标对象中。因此,上述正则表达式将无法与诸如 “abc”等的字符串匹配,因为“abc”中的最后一个字符为字母而非数字。 如果我们希望在正则表达式中实现类似编程逻辑中的“或”运算,在多个不同的模式中任选一个进行匹配的话,可以使用管道符 “|”。例如: /to|too|2/ 上述正则表达式将会与目标对象中的 “to”, “too”, 或 “2” 相匹配。 正则表达式中还有一个较为常用的运算符,即否定符 “[^]”。与我们前文所介绍的定位符 “^” 不同,否定符 “[^]”规定目标对象中不能存在模式中所规定的字符串。例如: /1/ 上述字符串将会与目标对象中除A,B,和C之外的任何字符相匹配。一般来说,当“^”出现在 “[]”内时就被视做否定运算符;而当“^”位于“[]”之外,或没有“[]”时,则应当被视做定位符。 最后,当用户需要在正则表达式的模式中加入元字符,并查找其匹配对象时,可以使用转义符“\”。例如: /Th*/ 上述正则表达式将会与目标对象中的“Th*”而非“The”等相匹配。 1> 正则函数php中有两套正则函数,两者功能差不多,分别为:一套是由PCRE(Perl Compatible Regular Expression,意思是Perl兼容正则表达式)库提供的,使用“preg_”为前缀命名的函数;一套是由POSIX(Portable Operating System Interface of Unix)扩展提供的,使用以“ereg_”为前缀命名的函数;(POSIX的正则函数库,自PHP 5.3以后,就不在推荐使用,从PHP6以后,就将被移除);由于POSIX正则即将推出历史舞台,并且PCRE和perl的形式差不多,更利于我们在perl和php之间切换,所以这里重点介绍PCRE正则的使用。在PCRE中,通常将模式表达式(即正则表达式)包含在两个反斜线“/”之间,如“/apple/”。使用PERL兼容规则的函数有:preg_grep()preg_replace_callback()preg_match_all()preg_match()preg_quote()preg_split()preg_replace()函数的具体使用,我们可以通过PHP手册来找到。2> 元字符(Meta-character):为了能够使用户更加灵活的定制模式内容,正则表达式提供了专门的“元字符”。所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。较为常用的元字符包括:“+”, “*”,以及“?”。其前导字符必须在目标对象中出现0次、1次或连续多次;. 用于匹配除换行符之外的所有字符1次;? 其前导匹配对象连续出现0次或1次;其前导匹配对象连续出现1次或多次;| 选择匹配类似PHP中的| (因为这个运算符合是弱类型导致前面最为整体匹配);^ 匹配对象出现在字符串的首部;$ 匹配对象出现在字符串尾部{m} 匹配前一个内容的重复次数为M次;{m,} 匹配前一个内容的重复次数大于等于M次;{m,n} 匹配前一个内容的重复次数M次到N次;( ) 合并整体匹配,并放入内存,可使用\1 \2…依次获取;\b 出现在目标字符串的开头或结尾的两个边界之一,边界可以是空格或者特殊字符;\B 对象必须位于目标字符串的开头和结尾两个边界之内,即匹配对象既不能作为目标字符串的开头,也不能作为目标字符串的结尾;\s:用于匹配单个空格符,包括tab键和换行符,等价于[\f\t\v];\S:用于匹配除单个空格符之外的任何一个字符,2;\d:匹配从0到9的一个数字,等价于[0-9];\D 匹配除数字以外任何一个字符,等价于3;\w:用于匹配一个字母、数字或下划线字符,等价于[0-9a-zA-Z_];\W:用于匹配所有除英文字母、数字和下划线以外任何的一个字符,4;\A 匹配字符串串首的原子\Z 匹配字符串串尾的原子\f 匹配一个换页符等价于 \x0c 或 \cL匹配一个换行符;等价于 \x0a 或 \cJ匹配一个回车符等价于\x0d 或 \cM\t 匹配一个制表符;等价于 \x09\或\cl\v 匹配一个垂直制表符;等价于\x0b或\ck\oNN 匹配一个八进制数字\xNN 匹配一个十六进制数字\cC 匹配一个控制字符为了能够方便用户更加灵活的设定匹配模式,正则表达式允许使用者在匹配模式中指定某一个范围而不局限于具体的字符。例如:/[A-Z]/上述正则表达式将会与从A到Z范围内任何一个大写字母相匹配。/[a-z]/上述正则表达式将会与从a到z范围内任何一个小写字母相匹配。/[0-9]/上述正则表达式将会与从0到9范围内任何一个数字相匹配。/(a-z[0-9])+/上述正则表达式将会与任何由字母和数字组成的字符串,如 “aB0” 等相匹配。\1 提取第一位的属性例如 /^\d{2} ([\W])\d{2}\1\d{4}$/匹配“12-31-2006”、“09/27/1996”、“86 01 4321”等字符串。但上述正则表达式不匹配“12/34-5678”的格式,这是因为模式“[\W]”的结果“/”已经被存储,下个位置“\1”引用时,其匹配模式也是字符“/”。这里需要提醒用户注意的一点就是可以在正则表达式中使用 “()”把字符串组合在一起。“()”符号包含的内容必须同时出现在目标对象中。因此,上述正则表达式将无法与诸如“abc”等的字符串匹配,因为“abc”中的最后一个字符为字母而非数字。如果我们希望在正则表达式中实现类似编程逻辑中的“或”运算,在多个不同的模式中任选一个进行匹配的话,可以使用管道符 “|”。例如:/to|too|2/上述正则表达式将会与目标对象中的 “to”, “too”, 或 “2” 相匹配。正则表达式中还有一个较为常用的运算符,即否定符“[^]”。与我们前文所介绍的定位符 “^” 不同,否定符“[^]”规定目标对象中不能存在模式中所规定的字符串。例如:/1/上述字符串将会与目标对象中除A,B,和C之外的任何字符相匹配。最后,当用户需要在正则表达式的模式中加入元字符,并查找其匹配对象时,可以使用转义字符“\”。例如:/Th*/上述正则表达式将会与目标对象中的“Th*”而非“The”等相匹配。当不需要存储匹配结果时使用非存储模式单元“(?:)”例如 /(?:a|b|c)(D|E|F)\1g/ 将匹配“aEEg”。在一些正则表达式中,使用非存储模式单元是必要的,否则需要改变其后引用的顺序。上例还可以写成/(a|b|c)(C|E|F)\2g/。3> 转义字符\d 包含所有数字[0-9]\D 除所有数字外3\w 包含所有英文字符[a-zA-Z_0-9]\W 除所有英文字符外5\s 包含空白区域如回车、换行、分页等 [\f\n\r]\a alarm,即 BEL 字符(’0)\cx "control-x",其中 x 是任意字符\e escape(’0B)\f 换页符 formfeed(’0C)\n 换行符 newline(’0A)\r 回车符 carriage return(’0D)\t 制表符 tab(’0)\xhh 十六进制代码为 hh 的字符\ddd 八进制代码为 ddd 的字符,或 backreference\d 任一十进制数字\D 任一非十进制数的字符\A 目标的开头(独立于多行模式)\Z 目标的结尾或位于结尾的换行符前(独立于多行模式)\z 目标的结尾(独立于多行模式)\G 目标中的第一个匹配位置……4> 模式修正符(Pattern Modifiers):模式修正符在忽略大小写、匹配多行中使用特别多,掌握了这一个修正符,往往能解决我们遇到的很多问题。i 匹配时忽略大小写,可同时匹配大小写字母;m 将字符串视为多行,当设定了此修正符,行起始(^)和行结束($)除了匹配整个字符串开头和结束外,还分别匹配其中的换行符(\n)的之后和之前;s 将字符串视为单行,换行符做普通字符看待,使“.”匹配任何字符;x 模式中的空白忽略不计U 匹配到最近的字符串,禁止贪婪匹配,只跟踪到最近的一个匹配符并结束,常用在采集程序上的正则表达式;U 模式字符串被当成UTF-8;e 将替换的字符串作为表达使用,只有preg_replace() 使用此修正符,其它 PCRE 函数将忽略之;A 如果设定了此修正符,模式被强制为“anchored”,即强制仅从目标字符串的开头开始匹配;D 如果设定了此修正符,模式中的行结束($)仅匹配目标字符串的结尾。没有此选项时,如果最后一个字符是换行符的话,也会被匹配在里面,如果设定了 m 修正符则忽略此选项;5> 运算顺序运算规则:从左→到右优先级:()( ) 圆括号因为是内存处理所以最高;? + { } 重复匹配内容其次;^ $ \b 边界处理第三;| 条件处理第四;最后按照运算顺序计算匹配。3、使用实例匹配action属性$str ='';preg_match_all("/\s+action=\"(?!http:)(.*?)\"\s/",$str,$arr);print_r($arr);在正则中使用回调函数/**replace some string by callback function*/function callback_replace() {$url = 'http://esfang.house.sina.com.cn';$str = '<form name="bbbb"action="http://www.bac.com/test.php" target="qwerqwerq"><form name="bbbb"action="http.php" target="qwerqwerq">';$str = preg_replace ( '/(?<=\saction=\")(?!http:)(.*?)(?=\"\s)/e','search($url, \1)', $str );echo $str;}function search($url, $match){return $url . '/' . $match;}带断言的正则匹配$match = '';$str = 'xxxxxx.com.cn _fcksavedurl=""">xxxxxx.com.cn"bold font paragraph text';preg_match_all ( '/(?<=<(\w{1})>).*(?=</\1>)/', $str, $match );echo "匹配没有属性的HTML标签中的内容:";print_r ( $match );替换HTML源码中的地址$form_html = preg_replace ('/(?<=\saction=\"|\ssrc=\"|\shref=\")(?!http:|javascript)(.*?)(?=\"\s)/e','add_url($url, \'\1\')', $form_html );1>PHP中可以使用ereg()函数进行模式匹配操作。ereg()函数的使用格式如下:ereg(pattern, string)其中,pattern代表正则表达式的模式,而string则是执行查找替换操作的目标对象。同样是验证邮件地址,使用PHP编写的程序代码如下:< ?phpif (ereg(“^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+”,$email)){echo “Your email address is correct!”;}else{echo “Please try again!”;}?>2>JavaScript1.2中带有一个功能强大的RegExp()对象,可以用来进行正则表达式的匹配操作。其中的test()方法可以检验目标对象中是否包含匹配模式,并相应的返回true或false。我们可以使用JavaScript编写以下脚本,验证用户输入的邮件地址的有效性。 想必很多人都对正则表达式都头疼,今天,我以我的认识,加上网上一些文章,希望用常人都可以理解的表达方式,来和大家分享学习经验。开篇,还是得说说 ^ 和 $ 他们是分别用来匹配字符串的开始和结束,以下分别举例说明:“^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}$”: 三个任意字符结尾。中括号括住的内容只匹配一个单一的字符“[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]$”: 匹配以逗号再加一个数字或字母结尾的字符串;你也可以把你不想要得字符列在中括号里,你只需要在总括号里面使用 ’^’作为开头“%6%”:匹配含有两个百分号里面有一个非字母的字符串。要点:^用在中括号开头的时候,就表示排除括号里的字符。为了PHP能够解释,你必须在这些字符面前后加”,并且将一些字符转义。不要忘记在中括号里面的字符是这条规路的例外——在中括号里面,所有的特殊字符,包括(”),都将失去他们的特殊性质,“[*+?{}.]”匹配含有这些字符的字符串。还有,正如regx的手册告诉我们:如果列表里含有’]’,最好把它作为列表里的第一个字符(可能跟在’^’后面)。如果含有’-’,最好把它放在最前面或者最后面,or 或者一个范围的第二个结束点[a-d-0-9]中间的‘-’将有效。看了上面的例子,你对{n,m}应该理解了吧。要注意的是,n和m都不能为负整数,而且n总是小于m。这样,才能最少匹配n次且最多匹配m次,如”p{1,5}”将匹配 “pvpppppp”中的前五个p。下面说说以\开头的\b 书上说他是用来匹配一个单词边界,就是…比如’ve\b’,可以匹配love里的ve而不匹配very里有ve。\B 正好和上面的\b相反。例子我就不举了…..突然想起来…,可以到 http://www.phpv.net/article.php/251 看看其它用\开头的语法好,我们来做个应用:如何构建一个模式来匹配货币数量的输入。构建一个匹配模式去检查输入的信息是否为一个表示money的数字。我们认为一个表示money的数量有四种方式:“10000.00”和“10,000.00”,或者没有小数部分,“10000”and“10,000”。现在让我们开始构建这个匹配模式:^1-9*$这是所变量必须以非0的数字开头,但这也意味着单一的”0″也不能通过测试,以下是解决的方法:^(0|1-9*)$“只有0和不以0开头的数字与之匹配”,我们也可以允许一个负号在数字之前:^(0|-?1-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地址中有三个部分:用户名 (在‘@’左边的一切)2.’@’服务器名(就是剩下那部分)用户名可以含有大小写字母阿拉伯数字,句号(’.’)减号(’-’)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-]+)$”,$eamil)就可以得到是否为email了正则表达式的其他用法提取字符串ereg() and eregi() 有一个特性是允许用户通过正则表达式去提取字符串的一部分(具体用法你可以阅读手册)。比如说,我们想从 path/URL 提取文件名,下面的代码就是你需要:ereg(”(7*)$”, $pathOrUrl, $regs);echo $regs[1];高级的代换ereg_replace() 和 eregi_replace()也是非常有用的,假如我们想把所有的间隔负号都替换成逗号:ereg_replace(”[ \n\r\t]+”, “,”, trim($str));最后,我把另一串检查EMAIL的正则表达式让看文章的你来分析一下:“^[-!#$%&\’*+\\./0-9=?A-Z^_a-z{|}~]+’.’@’.’[-!#$%&\’*+\\/0-9=?A-Z^_a-z{|}~]+\.’.’[-!#$%&\’*+\./0-9=?A-Z^_`a-z{|}~]+$”如果能方便的读懂,那这篇文章的目的就达到了。A-C ↩\f\t\v ↩0-9 ↩0-9a-zA-Z_ ↩a-zA-Z_0-9 ↩a-zA-Z ↩\/ ↩
2023年08月07日
19 阅读
0 评论
0 点赞
1
...
134
135
136
...
157