------------------------------------------------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><aclass="A00" target="_blank"href="/a/20081225/000378.htm2">历史2</a>';
preg_match_all('/<a[^>]+(.+?)<\/a>/i',$str,$arr);
/*
Array
(
[0] => Array
(
[0] => <aclass="A00" target="_blank"href="/a/20081225/000378.htm">历史</a>
[1] => <aclass="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] => <aclass="A00" target="_blank"href="/a/20081225/000378.htm">历史</a>
[1] => <aclass="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><aclass="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] => <aclass="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 = '<divid="biuuu">iyunv</div><divid="biuuu_2">iyunv2</div><divid="biuuu_3">iyunv3</div>';
|
实例要求:分别将每一个DIV元素的ID和内容取出,如biuuu,biuuu_2,biuuu_3,iyunv,iyunv2和iyunv3(一些常用的抓站方法就是这样匹配的)
分析:字符串是一个简单的HTML元素,每一个DIV元素对应该一个ID和内容,并且是独立的,首先考虑如何取 出一个DIV内的ID值和内容,如:iyunv,然后匹配其它类似的元素。一个DIV中需要取出两个值,也就是两个匹配的表达式,第一个表达式用于匹配 ID值(biuuu),第二个表达式用于匹配ID的内容(iyunv),正则表达式常用的表达式使用小括号,那么前面的元素将会变成如下形式:
<divid="(biuuu)">(iyunv)</div> <div id="(表达式1)">(表达式2)</div>
|
好,使用如上小括号把需要匹配的区域进行了划分,接下来就是如何匹配各个表达式内的内容,我们猜想一个ID可能是字母,数字或下划线,那这就变得简单了,使用中括号就可以实现,如下:
表达式1:[a-zA-Z0-9_]+(表示匹配大小写字母,数字和下划线)
那如何匹配表达式2,因为ID的内容可以是任意的字符,但是要注意,不能匹配<或>字符,因为如果匹配这两个字符将会把后面使用的DIV都匹配出来,因此需要排除这两个字符开始的元素,也就是不匹配以<或>字符,如下:
表达式2:[^<>]+(表示不匹配<和>字符)
这样,需要匹配的子表达式就实现了,但是还要需要匹配一个
的表达式,方法如下:
表达式:/ '\"(表达式1)\"'>(表达式2)<\/div>/
注意其中的双引号"和/需要使用\转义字符转义,然后把前面两个表达式放进去,如下:
'\"([a-z0-9_]+)\"'>/<divid=\"([a-z0-9_]+)\">([^<>]+)<\/div>/
这样就实现一个匹配每一个DIV元素ID值和内容的正则表达式,然后使用preg_match_all函数测试如下:
$html = '<div id="biuuu">iyunv</div><divid="biuuu_2">iyunv2</div><divid="biuuu_3">iyunv3</div>';
preg_match_all('/<div\sid=\"([a-z0-9_]+)\">([^<>]+)<\/div>/',$html,$result);
var_dump($result);
|
结果:
共有三个表达式,分别显示每一个表达式匹配的值,并以数组的形式存储,这样就把每一个DIV元素的ID和内容取出。使用正则表达式最主要还是要知道需要什么,然后跟椐需要进行匹配,并且思路清晰,并适当的借助preg_match_all函数进行输出调试,非常方便。
-----------------------测试题1:取出http和名称
$str = '
<LI><Ahref="http://www.cioage.com/news">资讯前沿</A></LI>
<LI><Ahref="http://www.cioage.com/insight">业界观察</A></LI>
<LI><Ahref="http://www.cioage.com/exp">应用体验</A></LI>
<LI><Ahref="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="
";
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:和问号的作用差不多,用于设置"贪婪模式"。
?表单非贪婪匹配,即尽可能少的匹配 |