php正则函数?php正则输出
其实php正则函数的问题并不复杂,但是又很多的朋友都不太了解php正则输出,因此呢,今天小编就来为大家分享php正则函数的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!
php 正则表达式如何判断一个字符串是否为合法的四则数学算式
^
(?!.*[^\d+\-*/\(\)])#规则0,字符串必须由数字,符号和括号组成
(?!.*\)\d)#规则A,不允许右括号后接数字
(?!.*[+\-*/]([+\-*/]|\)))#规则B,不允许符号后面接符号或右括号
(?!.*\([+*/])#规则C,不允许左括号后接运算符(-可以表示负号)
(?!.*(\d|\))\()#规则D,不允许左括号前有数字或右括号
(?=\d|\-|\()#规则E,字符串开头必须是,数字,负号,左括号中的一个
(?=.*(\d|\))$)#规则F:结尾必须是数字或者右括号
[^\(\)]*
#开始匹配,捕获括号,使用平衡组来判断括号数量是否相等,需要.NET的支持
(
(
(?'open'\()
[^\(\)]*
)+
(
(?'-open'\))
[^\(\)]*
)+
)*
(?(open)(?!))#规则G:左右括号数量必须相等
$
最终的正则表达式为:
^(?!.*[^\d+\-*/\(\)])(?!.*\)\d)(?!.*[+\-*/]([+\-*/]|\)))(?!.*\([+*/])(?!.*(\d|\))\()(?=\d|\-|\()(?=.*(\d|\))$)[^\(\)]*(((?'open'\()[^\(\)]*)+((?'-open'\))[^\(\)]*)+)*(?(open)(?!))$
没考虑空格的情况,因为考虑空格需要加很多很多个\s*,大大降低可读性
由于使用了平衡组,此正则表达式需要在.NET环境下运行
php正则表达式
优先匹配哪个?
通常是优先匹配左边的(从左往右执行嘛,然后又因为有贪婪性,比如[0-9]*[0-9]*去匹配123,左边的[0-9]*会匹配到12,右边的[0-9]*会匹配到3),正则表达式左边的部分会匹配到能是能使匹配成功的最长的匹配,具体原因如下:
贪婪、回溯和正则导向引正则擎的急切性:正则的{}和*合+有具贪婪性会向后匹配到他们可以匹配的尽可能多的字符串。但是如果重复性的匹配会引起整个(后面的)正则表达式匹配失败时,会引起回溯,放弃最后一次重复匹配(相当于剩余的字符串从左边增加了一位),用表达式后面的部分匹配剩余的字符串。在前面的正则匹配成功后立即用剩余的表达式部分继续匹配后面的内容,如果匹配成功会立刻返回匹配成功,不会继续回溯(php的正则表达式引擎室正则导向的)
。
里面的(.*)是怎么找得?
*有具贪婪性会向后匹配到.可以匹配的最大长度的字符串,最初匹配到-2011-2012,然后因为回溯不断减少匹配的值,直到匹配-201。
过程是怎样的,
执行顺序:
1.[0-9]{2,4}会先匹配到2010,
2.然后(.*),因为*得贪婪性会匹配到后面所有.能匹配的字符-2011-2012。
3.此时表达式执行到[0-9]{1,2},因为[0-9]{1,2}此时没有任何可以匹配的内容,所以引起回溯(.*)匹配到前一次匹配结果的倒数第2位重新匹配到-2011-201,[0-9]{1,2}与最后一位匹配成功得到字符串最后面的2,因为正则引擎的急切性,匹配成功后会立即用正则表达式剩余的部分继续向后匹配。
4.此时表达式执行到\1,字符串后面没有剩下任何东西所以\1(\1指(.*)匹配的结果-2011-201)匹配失败,然后引起回溯。[0-9]{1,2}向前移一位,结果[0-9]{1,2}没有字符可以进行匹配操作,匹配失败。引起回溯,(.*)匹配到前一次匹配结果的倒数第2位重新匹配到-2011-20,再用[0-9]{1,2}匹配得到12,后面依然没有字符与\1匹配,引起回溯,此次[0-9]{1,2}匹配到1,\1(此时值为-2011-20)与2匹配再次失败。于是重复上面的回溯【此处省去n百字,总之是重复上面的回溯】,直到(.*)匹配到-201,\1匹配到了-2012中的-201,因为正则导向的正则引擎是急切的,不再进行回溯,继续后面的匹配。
5.最后,[0-9]{1,2}与字串剩余部(最后一个字符)2匹配成功返回,因为正则导向的正则引擎是急切的,所以立刻返回匹配结果,不再进行回溯。
睡觉前看到的没想到写出来这么难,不过也没白写,就当总结了。
php正则表达来获取html中的部分内容
1、几种函数的简单说明:
(1)preg_grep--返回与模式匹配的数组单元
preg_grep返回一个input数组中与给定的 pattern模式相匹配的单元所组成的数组。
(2)preg_match--进行正则表达式匹配
说明:int preg_match( string pattern, string subject [, array matches [, int flags]])在 subject字符串中搜索与 pattern给出的正则表达式相匹配的内容。返回值0或1。
(3)preg_replace--执行正则表达式的搜索和替换
(4)preg_split--用正则表达式分割字符串
2.一般来说,如果用正则来获取匹配内容,一般使用 preg_match/ preg_match_all函数。
补充回答:
正则表达式如下:
'%<div class="wap2"><span>功能</span>(.*?)</div>%si'
以下是代码,经测试,运行正常:
<?php
$str='<div class="wap2"><span>功能</span>这里面是要获取的内容,不能确定什么字符,可能是数字(123456…)字母(babaidn…),特殊浮等(o_O\(^o^)/…)</div>';
$pa='%<div class="wap2"><span>功能</span>(.*?)</div>%si';
preg_match($pa,$str,$r);
echo$r[1];
?>
好了,文章到这里就结束啦,如果本次分享的php正则函数和php正则输出问题对您有所帮助,还望关注下本站哦!