`
zhengdl126
  • 浏览: 2538785 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

php实用总汇之正则

    博客分类:
  • php
阅读更多

------------------------------------------------POSIX风格和Perl风格比较
------perl风格的的正则是 两个斜线把字符串包含起来[preg_match,preg_match_all,preg_replace,preg_split]


$txt="3";
$tmpistrue=ereg("[0-9]", $txt);

echo $tmpistrue;
echo preg_match("/[0-9]/",$txt);

附:PCRE 语法指南

/ 定界符
^ 字符串头
$ 字符串尾
[a-z] 所有小写字母
[A-Z] 所有大写字母
[0-9] 所有数字
? 零或一个紧接前的字符
* 零或多个紧接前的字符
+ 一或多个紧接前的字符
{4} 4个紧接前的字符
{4,8} 4-8个紧接前的字符
. 任意字符
(red|green|blue) Red 或 green 或 blue(红 或 绿 或 蓝)
s 空格

特殊字符(需要在前加 )
( ) [ ] . * ? + ^ | $

--------posix 风格直接用一对引号把字符串包含起来[ereg,ereg_replace]

$Text="1-3";
echo ereg_replace("-",",",$Text);

$Text2="1-3";
echo preg_replace("/-/",",",$Text2);


---------------------------------------------------------------php正则参数

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 函数将忽略之。

 

 



---------------------------------------------------规则匹配 preg_match

int preg_match(string pattern, string subject, array [matches]);

本函数以 pattern 的规则来解析比对字符串 subject。比对结果返回的值放在数组参数 matches 之中,matches[0] 内容就是原字符串 subject、matches[1] 为第一个合乎规则的字符串、matches[2] 就是第二个合乎规则的字符串,余类推。若省略参数 matches,则只是单纯地比对,找到则返回值为 true。



$string = "football";if (preg_match('/foo/', $string)) {// 匹配正确
}

上面的例子将成功匹配,因为单词 football 里面包含 foo。现在我们来试一个更复杂的,例如验证一个 Email 地址。

$string = "first.last@domain.uno.dos“;
if (preg_match(‘/^[^0-9][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[@][a-zA-Z0-9_]+
([.][a-zA-Z0-9_]+)*[.][a-zA-Z]{2,4}$/’,$string)) {
// 验证Email地址
}


这个例子将验证出此 Email 地址为正确格式。现在让我们来看看这段正则表达式所代表的各种规则。
PCRE 顾名思义,与在 Perl 中的正则表达式有相同的语法,所以每段正则表达式必须要有一对定界符。我们一般使用 / 为定界符。

开头的 ^ 和结尾的 $ 让PHP从字符串开头检查到结尾。假使没有 $,程序仍会匹配到 Email 的末尾。

[ 和 ] 被用来限制许可输入类型。例如 a-z 允许所有的小写字母,A-Z 允许所有的大写字母,0-9 所有数字,等等,以及更多其他类型。

{ 和 } 被用来限制期望的字符数。例如 {2,4} 表示字符串的每一节可以有 2-4 字符长度,像是 .com.cn 或 .info。在这里, “.” 并不算

一个字符,因为 {2,4} 之前定义的许可输入类型只有大小写字母,故此段只匹配大小写字母

( 和 ) 被用来合并小节,并定义字符串中必须存在的字符。(a|b|c) 能够匹配 a 或 b 或 c。

(.) 将匹配所有字符,而 [.] 只匹配 “.” 本身。

要使用一些符号本身,必须在前增加一个 。这些字符有:( ) [ ] . * ? + ^ | $



---------------------------------------------------preg_match_all  进行全局正则表达式匹配

int preg_match_all ( string pattern, string subject, array matches [, int flags])

在 subject 中搜索所有与 pattern 给出的正则表达式匹配的内容并将结果以 flags 指定的顺序放到 matches 中。
搜索到第一个匹配项之后,接下来的搜索从上一个匹配项末尾开始。


preg_match_all('/<h4 class=\"px14\">(.*)<\/h4>/isU',$file,$vtie);unset($vtie[0]);
$str['vtie']=$vtie[1];

 

 

 

---------------------------------------- 分析 1

 

$str = '<a class="A00" target="_blank" href="/a/20081225/000378.htm"> 历史 </a><a class="A00" target="_blank" href="/a/20081225/000378.htm2"> 历史 2</a>';

 

preg_match_all('/<a[^> ]+(.+?) <\/a>/i',$str,$arr);

 

/*

  Array

(

    [0] => Array

        (

            [0] => <a class="A00" target="_blank" href="/a/20081225/000378.htm"> 历史 </a>

            [1] => <a class="A00" target="_blank" href="/a/20081225/000378.htm2"> 历史 2</a>

        )

 

    [1] => Array

        (

            [0] => > 历史

            [1] => > 历史 2

        )

 

)

 

*/

 

 

//preg_match_all('/<a[^class ]+(.+?)<\/a>/i',$str,$arr);

/*

  Array

(

    [0] => Array

        (

            [0] => <a class="A00" target="_blank" href="/a/20081225/000378.htm"> 历史 </a>

            [1] => <a class="A00" target="_blank" href="/a/20081225/000378.htm2"> 历史 2</a>

        )

 

    [1] => Array

        (

            [0] => class="A00" target="_blank" href="/a/20081225/000378.htm"> 历史

            [1] => class="A00" target="_blank" href="/a/20081225/000378.htm2"> 历史 2

        )

 

)

 

*/

 

 

print_r($arr);

 

 

由此可见

 

^

匹配输入字符串的开始位置。

 

 

+

匹配前面的子表达式一次或多次。例如, ’zo+’ 能匹配 “zo” 以及 “zoo” ,但不能匹配 “z” + 等价于 {1,}

 

(.+?)

匹配任意字符

 

 

 

---------------------------------------- 分析 2

 

 

 

$str = '<a class="A00" target="_blank" href="/a/20081225/000378.htm"> 历史 </a><a class="A00" target="_blank" href="/a/20081225/000378.htm2"> 历史 2</a>';

preg_match_all('/<a[^>]+ href="?([^>"]+)"?\s* [^>]*>(.+?)<\/a> /i',$str,$arr);

print_r($arr);

 

 

/*

  Array

(

    [0] => Array

        (

            [0] => <a class="A00" target="_blank" href="/a/20081225/000378.htm"> 历史 </a>

            [1] => <a class="A00" target="_blank" href="/a/20081225/000378.htm2"> 历史 2</a>

        )

 

    [1] => Array

        (

            [0] => /a/20081225/000378.htm

            [1] => /a/20081225/000378.htm2

        )

 

    [2] => Array

        (

            [0] => 历史

            [1] => 历史 2

        )

 

)

 

*/

 

 

 

<a[^>]+  去掉则没有 array[0]

href="?([^>"]+)"?\s*  去掉则没有 array[1]

[^>]*>(.+?)<\/a>  去掉则没有 array[2]

 

 

 

 

 

 

---------------------------------------------- 分析 3

 

实例代码

$html = '<div id="biuuu">51CTO</div><div id="biuuu_2">51CTO2</div><div id="biuuu_3">51CTO3</div>';

实例要求:分别将每一个DIV 元素的ID 和内容取出,如biuuubiuuu_2biuuu_351CTO51CTO251CTO3 (一些常用的抓站方法就是这样匹配的)

分析 :字符串是一个简单的HTML 元素,每一个DIV 元素对应该一个ID 和内容,并且是独立的,首先考虑如何取 出一个DIV 内的ID 值和内容,如:51CTO ,然后匹配其它类似的元素。一个DIV 中需要取出两个值,也就是两个匹配的表达式,第一个表达式用于匹配 ID 值(biuuu ),第二个表达式用于匹配ID 的内容(51CTO ),正则表达式常用的表达式使用小括号,那么前面的元素将会变成如下形式:

<div id="(biuuu)">(51CTO)</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">51CTO</div><div id="biuuu_2">51CTO2</div><div id="biuuu_3">51CTO3</div>';

preg_match_all('/<div\sid=\"([a-z0-9_]+)\">([^<>]+)<\/div>/',$html,$result);

var_dump($result);

结果:

 

共有三个表达式,分别显示每一个表达式匹配的值,并以数组的形式存储,这样就把每一个DIV 元素的ID 和内容取出。使用正则表达式最主要还是要知道需要什么,然后跟椐需要进行匹配,并且思路清晰,并适当的借助preg_match_all 函数进行输出调试,非常方便。

 

 

 

 

----------------------- 测试题 1 取出 http 和名称

$str = '

<LI><A href="http://www.cioage.com/news"> 资讯前沿 </A></LI>

<LI><A href="http://www.cioage.com/insight"> 业界观察 </A></LI>

<LI><A href="http://www.cioage.com/exp"> 应用体验 </A></LI>

<LI><A href="http://www.cioage.com/tech"> 杀手技术 </A></LI>

';

$patten = "/<LI><A\shref=\"(.+?)\">([^<>]+)<\/A><\/LI>/";

preg_match_all($patten,$str,$outs);

print_r($outs);

 

 

 

 

 

 

--------------------- 测试 2

字符串:<b>aaa</b><i>cccc</i><u>fff</u><a>kkkk</a>(无顺序)而我想用preg_match_all一次就取出aaa和ccc

$str = "<b>aaa</b><i>cccc</i><u>fff</u><a>kkkk</a>";
preg_match_all("/(<b>|<i>)(.*?)(<\/b>|<\/i>)/", $str, $outs);
//preg_match_all("/<b>([a-zA-Z0-9_]+)<\/b><i>([a-zA-Z0-9_]+)<\/i>/",$str,$outs);
echo "<pre>";
print_r($outs);

 

 

 

 

 

---------------------------------------------------------测试 3

$str ='
.nav a:hover
{
color: #F00;
 height:43px;
 background:url(img/dddd.gif) no-repeat content bottom;
}
.nadul li a:hover
{
color: #F00;
height:43px;
 background:url(img/na2v.gif) no-repeat content bottom;
}
.nav ul li
{
 color: #F00;
height:43px;
background:url(img/dddss.gif) no-repeat content bottom;
 }
';
 $patten="/\.nav.*?\(img\/(.*?)(?=\))/s";
 preg_match_all($patten,$str,$outs);
 echo "<pre>";
print_r($outs[1]);

/*
----------$outs 输出:
Array
(
    [0] => Array
        (
            [0] => .nav a:hover
{
color: #F00;
 height:43px;
 background:url(img/dddd.gif
            [1] => .nav ul li
{
 color: #F00;
height:43px;
background:url(img/dddss.gif
        )

    [1] => Array
        (
            [0] => dddd.gif
            [1] => dddss.gif
        )

)
------------

 */
 
 
---------------------------------------------------------------------------strip_tags
echo strip_tags("<h4><span id='CompanyView_ctl00_lbCorpName'>公司名称</span></h4>");
string strip_tags(string str);
本函数可去掉字符串中包含的任何 HTML 及 PHP 的标记字符串。若是字符串的 HTML 及 PHP 标签原来就有错,例如少了大于的符号,则也会返回错误。
输出:公司名称

 

 

 

 


---------------------------------------------------规则替换 preg_replace
preg_replace 允许你替换字符串中匹配到你定义的正则表达式。一个简单的注释移除功能:

preg_replace('[(/*)+.+(*/)]', '', $val);

这段代码可以移除在 PHP 和 CSS 中使用 /* 注释 */ 格式的多多行注释。其中的三个参数分别为正则表达式,要替换成的字符串和要替换的

目标字符串(这里要做移除功能,所以是个空白字符串 -> ”)。如果你想匹配次级规则,可以使用 $0 代表全部匹配,$1、$2 等,以此类推

代表分别的次级规则。


----------------------------------------------------规则分割preg_split
preg_split 可以将整段字符串按匹配到的正则表达式分割成 1、2或更多字符的多段。比如获取标签,无论是用空格还是逗号分隔的:

$tags = preg_split('/[,]/', 'my,tags,unevenly,spaced');
print_r($tags);

 

 



---------------------------------------------------ereg

 PHP中的ereg()函数是配合正则表达式使用的,正则表达式用以检测字符串的匹配。起函数原形是:

       int ereg(string pattern,string string,array[regs])

       其中:pattern是规则,第二个参数string以pattern规则来匹配,在第三个参数为空时,如果匹配则返回true,否则返回false,第三

个参数array[regs]是可选参数,array[0]存储的是string整个字符串,array[1]是满足pattern规则的第一个子串,array[2]是满足规则的第

二个子串,以此类推。


<?
$tmpistrue=ereg("[0-9]", 3);
echo $tmpistrue;
?>
[/PHP]

执行结果为真,表示3是字母,是0——9之间的一个数字。


if(ereg(',',$typeid)) {//dedecms里的用法:是否包含,
            $tpsql = " reid in($typeid) And ispart<>2 And ishidden<>1 ";
}
else {
            $tpsql = " reid='$typeid' And ispart<>2 And ishidden<>1 ";
}



---------------------------------------------------ereg_replace

字符串比对解析并取代。

语法: string ereg_replace(string pattern, string replacement, string string);

本函数以 pattern 的规则来解析比对字符串 string,欲取而代之的字符串为参数 replacement。返回值为字符串类型,为取代后的字符串结

果。


$Text="1-3";
 $Text=ereg_replace("-",",",$Text);
echo $Text;



<?php
$text  =  'This is a {1} day, not {2} and {3}.' ;
$daytype  = array(  1  =>  'fine' ,
                   2  =>  'overcast' ,
                   3  =>  'rainy'  );
while ( ereg  ( '{([0-9]+)}' ,  $text ,  $regs )) {
   $found  =  $regs [ 1 ];
   $text  =  ereg_replace ( "\{" . $found . "\}" ,  $daytype [ $found ],  $text );
}
echo  "$text \n " ;
// This is a fine day, not overcast and rainy.
?>






----------------------------------实例总汇


---------------图片标签替

<?
$str="[img]http://www.baidu.com/img/logo.gif[/img]";
echo preg_replace( '/\[img\](.+)\[\/img\]/isU','<img src="$1" />',$str );
------------------

$post=preg_replace("/\[html\](.+?)\[\/html\]/eis","htmlcode('\\1')",$post);
修饰符:
在正则表达式里面的修饰符可以改变正则的很多特性,使得正则表达式更加适合你的需要(注意:修饰符对于大小写是敏感的,这意味着"e"并

不等于"E")。正则表达式里面的修饰符如下:
i :如果在修饰符中加上"i",则正则将会取消大小写敏感性,即"a"和"A" 是一样的。
m:默认的正则开始"^"和结束"$"只是对于正则字符串如果在修饰符中加上"m",那么开始和结束将会指字符串的每一行:每一行的开头就是"^"

,结尾就是"$"。
s:如果在修饰符中加入"s",那么默认的"."代表除了换行符以外的任何字符将会变成任意字符,也就是包括换行符!
x:如果加上该修饰符,表达式中的空白字符将会被忽略,除非它已经被转义。
e:本修饰符仅仅对于replacement有用,代表在replacement中作为PHP代码。
A:如果使用这个修饰符,那么表达式必须是匹配的字符串中的开头部分。比如说"/a/A"匹配"abcd"。
E:与"m"相反,如果使用这个修饰符,那么"$"将匹配绝对字符串的结尾,而不是换行符前面,默认就打开了这个模式。
U:和问号的作用差不多,用于设置"贪婪模式"。
?表单非贪婪匹配,即尽可能少的匹配

分享到:
评论

相关推荐

    10个实用的PHP正则表达式汇总

    本文实例讲述了10个实用的PHP正则表达式汇总,分享给大家供大家参考。具体如下: 正则表达式是程序开发中一个重要的元素,它提供用来描述或匹配文本的字符串,如特定的字符、词或算式等。但在某些情况下,用正则...

    精通正则表达式~~~

    正则表达式术语汇总... 27 改进现状... 30 总结... 32 一家之言... 33 第2章:入门示例拓展.... 35 关于这些例子... 36 Perl简短入门... 37 使用正则表达式匹配文本... 38 向更实用的程序前进... 40 成功...

    php正则删除html代码中class样式属性的方法 <font color=red>原创</font>

    在进行正则表达式测试和调试时,以下两款在线工具非常实用: - **JavaScript正则表达式在线测试工具**: 地址:http://tools.jb51.net/regex/javascript 这个工具可以帮助你实时测试正则表达式,支持JavaScript...

    php 手册汇总(zend,thinkphp)

    ThinkPHP是中国最流行的PHP框架之一,以其简洁易用和快速开发的特点受到开发者喜爱。手册中的重点可能包括: 1. **快速入门**:介绍如何搭建环境、创建项目,并编写第一个Hello World程序。 2. **ActiveRecord模式*...

    (全)传智播客PHP就业班视频完整课程

    非常实用 持之以恒才是王道! 8-11 1.html介绍 html运行原理① 8-11 2.html运行原理② html文件基本结构 html元素和属性 8-11 3.符号实体 url说明 超链接 发送电邮 8-11 4.图像 表格 实际应用-菜谱 课堂练习-课程表 8...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    每个实例都经作者精心筛选,具有很强的实用性,其中一些实例是开发人员难于寻觅的解决方案。   本书适合PHP的初学者,如高校学生、求职人员作为练习、速查、学习使用,也适合PHP程序员参考、查阅。 目 录 目录:...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    每个实例都经作者精心筛选,具有很强的实用性,其中一些实例是开发人员难于寻觅的解决方案。   本书适合PHP的初学者,如高校学生、求职人员作为练习、速查、学习使用,也适合PHP程序员参考、查阅。 目 录 目录:...

    电脑资源小手册

    【电脑资源小手册】是一份综合性的IT学习资料,它包含了一系列与计算机操作和编程相关的文档,特别是针对Linux操作系统和Web开发的实用信息。这份小手册以简洁易懂的方式介绍了多个关键知识点,旨在帮助用户更好地...

    PHPCHINA论坛志6月.pdf

    ### 算法学习之路 #### 初级阶段 在学习算法的初级阶段,重点在于理解算法的基本概念和常见数据结构。初级阶段的算法学习者需要掌握基础的算法原理和思想,比如递归、分治、动态规划等。为了方便练习,文中提到了...

    PHPExcel冻结(锁定)表头的简单实现方法

    - PHP正则表达式用法总结:总结了正则表达式在PHP中的使用。 - PHP字符串(string)用法总结:讲解PHP字符串处理的相关方法。 - PHP常见数据库操作技巧汇总:涉及MySQL、SQLite等数据库在PHP中的操作技巧。 以上知识...

    php删除txt文件指定行及按行读取txt文档数据的方法

    对于有志于深入学习PHP的开发者来说,除了本文提及的资料外,还可以参考《php文件操作总结》、《php字符串(string)用法总结》等专题,以及各种基础教程和操作技巧汇总。 在实际应用中,PHP的文件操作技巧非常实用,...

    php字符串操作针对负值的判断分析

    PHP作为一门广受欢迎的服务器端脚本语言,在Web开发领域...最后,《php常见数据库操作技巧汇总》为读者提供了关于数据库操作方面的实用技巧。通过这些资料的学习,可以更好地提升PHP编程能力,并在实际开发中灵活运用。

    PHP实现超简单的SSL加密解密、验证及签名的方法示例

    - 《PHP编码与转码操作技巧汇总》 - 《PHP数学运算技巧总结》 - 《PHP数组(Array)操作技巧大全》 - 《php字符串(string)用法总结》 - 《PHP数据结构与算法教程》 - 《php程序设计算法总结》 - 《php正则...

    史上最全的前端资源汇总

    - **兼容性/UI相关/图表类/正则/前端规范/PHP/算法/移动端/JSON/焦点图/UI方案/页面社会化分享功能/富文本编辑器/文件上传/模拟select/取色插件/城市联动/剪贴板/简繁转换/表格Grid/在线演示/常规优化/优化工具/在线...

    JavaScript语言精粹

    它主要是提供了一个学习资源的汇总,包括了软考教程、各类编程语言的教程和视频、数据库管理系统、平面设计、3D动画、Linux和UNIX学习资源、网络编程、PHP、UML、软件设计与开发资料、Linux视频教程等。这部分内容更...

    pblogan-开源

    总结来说,pblogan是电话亭日志分析领域的一个实用工具,通过Perl脚本实现数据提取,借助PostgreSQL数据库进行存储,以及PHP网页提供用户界面,实现了从数据收集到分析的完整流程。开源的特性使得它具备了高度的可...

    文件批处理百宝箱 v10.0.rar

    界面友好,人性化设计,功能实用,是一款不可多得的实用性强的小工具箱;具体用法和操作,会有实时的操作提示、功能提示、操作通知、状态显示等。   文件批量处理百宝箱 v10.0 Build 140103更新内容: 1.在主...

    MySQL产生随机数并连接字符串的方法示例

    `fetchall()`方法用于获取查询结果的所有行,而过滤特殊字符通常涉及字符串操作和正则表达式。 SQL Server和MySQL的连接字符串配置略有不同,但通常包含数据库服务器地址、端口号、数据库名、用户名和密码等信息。 ...

Global site tag (gtag.js) - Google Analytics