入住 CI 中国社区 登录
CodeIgniter 中国开发者社区 返回首页

khalilfiona的个人空间 https://codeigniter.org.cn/forums/?28044 [收藏] [复制] [分享] [RSS]

日志

php正则表达式

已有 1728 次阅读2013-8-23 13:24 |个人分类:php| 正则表达式, 文件操作

php正则表达式
1、基本语法
正则表达式的形式一般如下
/love/
位于"/"定界符之内的就是将要在目标对象进行匹配的模式。
用户只要把希望查找匹配的对象模式内容放在"/"定界符之间即可。
为了使用户更加灵活的定制模式内容,正则表达式提供了专门的
元字符,即具有特殊含义的字符。常用的如:"+","*","?"
"+":其前导字符在目标对象中出现1次或连续多次
"*": 其前导字符在目标对象中出现0次或连续多次
""?: 其前导对象必须在目标对象中连续出现0次或1次
例如:
/fo+/:可以与目标对象中的"fool","fo", 或者"football"等在字母f后面连续
出现1个或多个字母o的字符串相匹配。
/eg*/:可以与目标对象中的"ego", 或者 "egg"等在字母e后面连续出现0个或
多个字母g的字符串相匹配。
/wil?/:可以与目标对象中的"Win"或者"Wilson",等在字母"i"后面连续出现0
个或多个字母g的字符串相匹配。
/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/:可以与目标对象中以 “bomb”, 或 “bom”开头的字符串相匹配
/man\b/:可以与目标对象中以 “human”, “woman”或 “man”结尾的字符串相匹配。

为了能够方便用户更加灵活的设定匹配模式,正则表达式允许使用者在匹配模式中指定某一个范围而不局限于具体的字符。(这个功能太好了!)
/[A-Z]/:上述正则表达式将会与从A到Z范围内任何一个大写字母相匹配
/[a-z]/:上述正则表达式将会与从a到z范围内任何一个小写字母相匹配
/[0-9]/:上述正则表达式将会与从0到9范围内任何一个数字相匹配
/([a-z][A-Z][0-9])+/:上述正则表达式将会与任何由字母和数字组成的字符串,如 “aB0” 等相匹配。这里需要提醒用户注意的一点就是可以在正则表达式中使用 “()” 把字符串组合在一起。“()”符号包含的内容必须同时出现在目标对象中。因此,上述正则表达式将无法与诸如 “abc”等的字符串匹配,因为“abc”中的最后一个字符为字母而非数字。

管道符 “|”
如果我们希望在正则表达式中实现类似编程逻辑中的“或”运算,在多个不同的模式中任选一个进行匹配。
/to|too|2/
上述正则表达式将会与目标对象中的 “to”, “too”, 或 “2” 相匹配

否定符 “[^]”
 “[^]”规定目标对象中不能存在模式中所规定的字符串
 /[^A-C]/
 上述字符串将会与目标对象中除A,B,和C之外的任何字符相匹配。一般来说,当“^”出现在 “[]”内时就被视做否定运算符;而当“^”位于“[]”之外,或没有“[]”时,则应当被视做定位符。

转义字符\*代表*  /Th\*/
当用户需要在正则表达式的模式中加入元字符,并查找其匹配对象时,可以使用转义符“\”。
上述正则表达式将会与目标对象中的“Th*”而非“The”等相匹配。

使用实例:把一个文件中每行中的数字替换成null
原串:
INSERT INTO `categories` VALUES ('1', '散文集', '文学类');
INSERT INTO `categories` VALUES ('2', '悬疑小说', '文学类');
INSERT INTO `categories` VALUES ('33', '诗歌', '文学类');
INSERT INTO `categories` VALUES ('44', '计算机', '科技类');
INSERT INTO `categories` VALUES ('445', '医学', '科技类');
INSERT INTO `categories` VALUES ('66', '教材', '教育类');
INSERT INTO `categories` VALUES ('77', '体育', '其他类');
目标串:
INSERT INTO `categories` VALUES ('null', '悬疑小说', '文学类');
INSERT INTO `categories` VALUES ('null', '散文集', '文学类');
INSERT INTO `categories` VALUES ('null', '诗歌', '文学类');
INSERT INTO `categories` VALUES ('null', '计算机', '科技类');
INSERT INTO `categories` VALUES ('null', '医学', '科技类');
INSERT INTO `categories` VALUES ('null', '教材', '教育类');
INSERT INTO `categories` VALUES ('null', '体育', '其他类'); 
实现方法:
<?php
include 'd:/wamp/debug/debug.php';
$file_path='data.txt';
$file=fopen('data.txt','r') or exit("unable to open!") ;
//$file_size=filesize('data.txt');
//$text_content=fread($file,200);//第二个参数为读取的长度
//$text_content=file_get_contents('data.txt');//性能优于fread
while(!feof($file))
{
$line=fgets($file)."<br />";
//echo $line;
//$pa='%[0-9]*[0-9]%';
$pa='/\d+/';
//$pa='%[^a-zA-Z]%' ;
echo preg_replace($pa,'null',$line);

}
fclose($file);
?>



路过

雷人

握手

鲜花

鸡蛋

全部作者的其他最新日志

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 入住 CI 中国社区