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:和问号的作用差不多,用于设置"贪婪模式"。
?表单非贪婪匹配,即尽可能少的匹配

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值