设为首页 收藏本站
查看: 667|回复: 0

[经验分享] php实用总汇之正则

[复制链接]
发表于 2017-3-28 11:15:15 | 显示全部楼层 |阅读模式
  ------------------------------------------------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=" DSC0000.gif ";
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:和问号的作用差不多,用于设置"贪婪模式"。
?表单非贪婪匹配,即尽可能少的匹配

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-356371-1-1.html 上篇帖子: PHP功能齐全的发送邮件类-php实例 下篇帖子: php 重要工具函数
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表