正则表达式收集汇总

所属栏目:建站技术 更新时间:2020-12-05 点击: 文章来源:https://www.sznest.net/jzjs/3543.html

搜索 :empty\((\$)tr\['([a-z]{1,})']\),可以查找这样的empty($tr['digest']),然后可以替换成!$digest

替换:!$1$2


匹配A标签的超连接的正则表式如下
$pattern = "/<a[^>]+?href=[\"']?([^\"']+)[\"']?[^>]*>([^<]+)<\/a>/i";


匹配百度编辑器上传的附件之后的获取附件路径,名称,后缀,以及><之间的文本
$pattern = "/<a[^>]+?href=[\"']?(\/public\/[^\"']+)[\"']?\s+title=[\"']?([^\.\\s]+)\.([^\\s\"']+)[\"']?[^>]*>([^<]+)<\/a>/i";

preg_match_all($pattern , $content, $matches);


匹配百度编辑器多张单图上传图片之后的获取路径,名称,后缀

$pattern = '/<img\s+alt=["\']?([^\.]+?)\.([^\.]+?)["\']?\s+src=["\']?([^"\'\\s]+)["\']?\s+[^>]*?>/i';
preg_match_all($img_pattern , $content, $matches);


匹配百度编辑器多图上传图片之后的获取路径,名称,后缀

$pattern = '/<img\s+src=["\']?([^"\'\\s]+?)["\']?\s+style=["\']?[^"\'\\s]*?["\']?\s+title=["\']?([^\.]+?)\.([^\'"]+)["\']?[^>]*?>/i';
preg_match_all($img_pattern , $content, $matches);


通过正则表达式获取得表名
preg_match_all('/\*\s+from\s+[\w\[\]]*\.?[\w\[\]]*\.?\[?(\b\w+)\]?[\r\n\s]*/i',"select * from sznest",$match);
$tablename = $match[1][0];

通过正则表达式获取img图片

preg_match_all('/<\s*img\s+[^>]*?src\s*=\s*(\'|\")(.*?)\\1[^>]*?\/?\s*>/i',$content,$match)
等价于

preg_match_all('/<\s*img\s+[^>]*?src\s*=\s*(\'|\")(.*?)(\'|\")[^>]*?\/?\s*>/i',$content,$match)

所以可以从上面的\1表示是正则表达式中第一个括号内的引用即(\'|\")


再来看引用一个示例

$content = '<div align="center"><a href="productShow.asp?ID=742"><img src="/UploadFiles/20142289580965.jpg"  width="242" height="194" style="BORDER-BOTTOM-COLOR: #cccccc; BORDER-TOP-COLOR: #cccccc; BORDER-RIGHT-COLOR: #cccccc; BORDER-LEFT-COLOR: #cccccc" />
<div align="center"><a href="productShow.asp?ID=743"><img src="/UploadFiles/2014228102239878.jpg"  width="242" height="194" style="BORDER-BOTTOM-COLOR: #cccccc; BORDER-TOP-COLOR: #cccccc; BORDER-RIGHT-COLOR: #cccccc; BORDER-LEFT-COLOR: #cccccc" />';

preg_match_all('/<div\s{1,}align=\"center\"><a\s{1,}href=\"productShow\.asp\?ID=([0-9]{1,5})\"><\s*img\s+[^>]*?src\s*=\s*(\'|\")(.*?)\\2[^>]*?\/?\s*>/i', $content, $match);

上面的\2表示是正则表达式中第二个括号内的引用即(\'|\"),所以上面的表达式同样等价于

preg_match_all('/<div\s{1,}align=\"center\"><a\s{1,}href=\"productShow\.asp\?ID=([0-9]{1,5})\"><\s*img\s+[^>]*?src\s*=\s*(\'|\")(.*?)(\'|\")[^>]*?\/?\s*>/i', $content, $match);


再来看查找重复的单词这个表达式,有助于加深对引用的理解

$str = "Is is the cost off off gasoline going upde upde";
$preg = '/\b([a-z]+) \1\b/i';
preg_match_all($preg,$str,$match);
print_r($match);



匹配坐机的正则表达式如下
\b[0-9]{3,4}-[0-9]{7,8}    匹配区号后面有中杠的
\([0-9]{3,4}\)[0-9]{7,8}   匹配区号带括号的
下面的可以合并为下面的一行
[\(]?[0-9]{3,4}[\)]?[-]?[0-9]{7,8}


匹配手机的正则表达式如下
\b1[0-9]{10}

匹配邮箱的正则表达式如下
[a-z]([a-z0-9]*[-_]?[a-z0-9]+)*@([a-z0-9]*[-_]?[a-z0-9]+)+[\.][a-z]{2,3}([\.][a-z]{2})?

匹配时间的正则表达式如下
([0-9]{4}/[0-9]{1,2}/[0-9]{1,2}\s[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}
比如2017/1/10 15:53:55
如果要匹配2017/1/10 15:53:55      点击:
([0-9]{4}/[0-9]{1,2}/[0-9]{1,2}\s[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}\s+点击:)\r\n
\r\n表示匹配文字后面的换行符

 

常用元字符作用
\d匹配一个数字字符。等价于[0-9]
\D匹配一个非数字字符。等价于[^0-9]
\s匹配任何空白字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]
\S匹配任何非空白字符。等价于[^ \f\n\r\t\v]
\t匹配一个制表符。等价于\x09和\cI
\w匹配包括下划线的任何单词字符。等价于"[A-Za-z0-9_]"
\W匹配任何非单词字符。等价于“[^A-Za-z0-9_]”,比如汉字、单引号、双引号、等号



匹配php长标签与短标签
<\?php echo\s{1,}\$[^[?>]*\[['|"][^'"?>]*['|"]];\s{0,2}\?>
<\?php echo\s{1,}(\$[^[?>]*\[['|"][^'"?>]*['|"]]);\s{0,2}\?>
<?=$1?>
匹配下面的两种情况
<?php $value['abc']; ?>
<?php $value["abc"]; ?>

<\?php\s{1,}echo\s{1,}\$[^;]*;\?>
<\?php\s{1,}echo\s{1,}(\$[^;]*);\?>
匹配下面的这种情况
<?php echo $mobile;?>

<\?php\s{1,}echo\s{1,}([^;]*)\?>
<\?php\s{1,}echo\s{1,}(\$[^;]*);\s{1,}\?>
<\?php\s{1,}echo\s{1,}([^;]*);\s{0,}\?>

<\?=\(\$[^)]*\)\?>
<\?=\((\$[^)]*)\)\?>
匹配下面的这种情况
<?=($msgtype)?>


<\?=\$[^[?]*\['[^'[?]*'\]\?>
匹配下面的这种情况
<?=$value['abc']?>

<\?=\$[^[?]*\["[^"?]*"\]\?>
匹配下面的这种情况
<?=$value["abc"]?>


<\?=(\$[^[?]*)\["([^"?]*)"\]\?>
<?=$1['$2']?>
把下面的双引号变成单引号
<?=$v1["cname"]?>
<?=$v1['cname']?>


this->tr\[["|']([a-z_]+)["|']\]
匹配下面的这种情况
this->tr["id"]
this->tr['id']

<?php
ob_start();
?>
<p id="name"> 与左边的右尖括号有一个空格喔  与右边的左尖括号有两个空格喔  </a>
<p>   与左边的右尖括号有三个空格喔</a>
<p>只与右边的左尖括号有四空格喔    </a>
<p>两边没有空格   但是中间有空格喔</a>

<?php
    //过滤换行,删除左尖括号左边的空格,去掉右尖括号右边的空格,但是不过滤连续字符串中的空格

    $text = str_replace(PHP_EOL, '', ob_get_flush());//过滤缓存的换行

    //$pattern1 = '/(?<=\>)([\s]+)(?=\<)/i';//匹配标签之间所有的空格
    //网上有人说这个正则表达式除了可以去掉标签与标签之间的空格之外还可以过滤标签和文本之间的空格,但是经过反复测试,只能清除标签之间所有的空格,并不能去掉标签与文本之间的空格,要实现即过滤标签之间的空白又要删除标签与文本之间的空白还需要通过下面的两个表达式配合来实现

    //匹配左尖括号左边空格
    $pattern2 = '/(?<=[^\s])([\s]+)(?=<)/';

    //匹配右尖括号右边空格
    $pattern3 = '/(?<=>)([\s]+)(?=[^\s])/';

    //如果匹配替换之后中文出现乱码,需对字符串用urlencode编码与urldecode解码处理
    //$pattern2 = '/(?<=[^\+])([\+]+)(?=%3C)/';//匹配左尖括号左边空格
    //$pattern3 = '/(?<=%3E)([\+]+)(?=[^\+])/';//匹配右尖括号右边空格
    //$text=urlencode($text);//空格的url编码是+,左尖括<是%3C,右尖括>是%3E
    //下面是从缓存中获取的数据然后编码之后的结果
    //$str = "%3Cp+id%3D%22name%22%3E+%E4%B8%8E%E5%B7%A6%E8%BE%B9%E7%9A%84%E5%8F%B3%E5%B0%96%E6%8B%AC%E5%8F%B7%E6%9C%89%E4%B8%80%E4%B8%AA%E7%A9%BA%E6%A0%BC%E5%96%94++%E4%B8%8E%E5%8F%B3%E8%BE%B9%E7%9A%84%E5%B7%A6%E5%B0%96%E6%8B%AC%E5%8F%B7%E6%9C%89%E4%B8%A4%E4%B8%AA%E7%A9%BA%E6%A0%BC%E5%96%94++%3C%2Fa%3E%3Cp%3E+++%E4%B8%8E%E5%B7%A6%E8%BE%B9%E7%9A%84%E5%8F%B3%E5%B0%96%E6%8B%AC%E5%8F%B7%E6%9C%89%E4%B8%89%E4%B8%AA%E7%A9%BA%E6%A0%BC%E5%96%94%3C%2Fa%3E%3Cp%3E%E5%8F%AA%E4%B8%8E%E5%8F%B3%E8%BE%B9%E7%9A%84%E5%B7%A6%E5%B0%96%E6%8B%AC%E5%8F%B7%E6%9C%89%E5%9B%9B%E7%A9%BA%E6%A0%BC%E5%96%94++++%3C%2Fa%3E%3Cp%3E%E4%B8%A4%E8%BE%B9%E6%B2%A1%E6%9C%89%E7%A9%BA%E6%A0%BC+++%E4%BD%86%E6%98%AF%E4%B8%AD%E9%97%B4%E6%9C%89%E7%A9%BA%E6%A0%BC%E5%96%94%3C%2Fa%3E";
    //echo $text;

    preg_match_all($pattern2,$text, $match2);
    preg_match_all($pattern3,$text, $match3);

    echo "<pre>";
    print_r($match2);//这里匹配到的是左边尖括号的二个与四个空格
    print_r($match3);//这里匹配到的是左边尖括号的一个与三个空格

    $text=preg_replace($pattern2,"",$text);
    $text=preg_replace($pattern3,"",$text);

    //url解码
    //$text=urldecode($text);

    echo $text;
    exit;
?>
如果对上面的正则表达式看不明白,请看下面的两种匹配模式的说明,是从百度百科中摘录下来的,希望对你理解非获取匹配有所帮助!

(?<=pattern)
非获取匹配,反向肯定预查,与正向肯定预查类似,只是方向相反。例如,“(?<=95|98|NT|2000)Windows”能匹配“2000Windows”中的“Windows”,但不能匹配“3.1Windows”中的“Windows”。

(?=pattern)
非获取匹配,正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用。例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。


(?:pattern)
非获取匹配,匹配pattern但不获取匹配结果,不进行存储供以后使用。这在使用或字符“(|)”来组合一个模式的各个部分时很有用。例如“industr(?:y|ies)”就是一个比“industry|industries”更简略的表达式。


注意事项:

如果一个正则表达式中即有正向肯定预查也有反向肯定预查时,反向肯定预查在前面,正向肯定预查只能在后面,就比如匹配右尖括号右边空格的正则表达式正确的是'/(?<=%3E)([\+]+)(?=[^\+])/',而不能是'/(?=%3E)([\+]+)(?<=[^\+])/'


为了更好的理解以上的几个非获取匹配,再链接数据库测试下面的代码
//防止操作另外一个子网站的数据开始
$result = mysqli_query($GLOBALS["conn"], "show tables like '".WebConfig::prefix."%'");
$tables = array();
while ($currow = mysqli_fetch_array($result)) {
    $tables[] = $currow[0];
}
mysqli_free_result($result);
$newTables = array();
foreach ($tables as $value) {
  $newTables[] = str_replace(WebConfig::prefix, "", $value);
}
foreach ($newTables as $value) {
  //$pattern = "/\s+`?([a-z]+_".$value.")`?\s*?\(?/i";//\s+匹配至少一次空格 `?匹配`零次或一次 [a-z]+匹配字母至少一次 \s*?是匹配空格任意多次,后面的?表示是非贪婪匹配,(?匹配左括号零次或一次
  //非获取匹配
  $pattern = "/(?!\s+`?)([a-z]+_".$value.")(?=`?\s*?\(?)/i";//有结果 推荐这个,下面判断的时候用if($match[0])
  //$pattern = "/(?!\s+`?)([a-z]+_".$value.")(?:`?\s*?\(?)/i";//有结果
  //$pattern = "/(?!\s+`?)([a-z]+_".$value.")(?!`?\s*?\(?)/i";//无结果
  //$pattern = "/(?!\s+`?)([a-z]+_".$value.")(?<=`?\s*?\(?)/i";//出错


匹配一个不是十二生肖的汉字0次或者1次或者多次
(?!鼠|牛|虎|兔|龙|蛇|马|羊|猴|鸡|狗|猪)[\x{4e00}-\x{9fa5}]{0,}

连续的一个汉字加数字转化成汉字与数字中间加反斜杠,每组之间用空格隔开
龙10蛇100牛30
龙/10 蛇/100 牛/30
preg_replace("/([\x{4e00}-\x{9fa5}])(\d{1,})/u","$1"."/"."$2"." ", $value);


匹配以十二生肖数字大写金额一次以上,并且非十二生肖的汉字或标点符号一次以上
$preg = '/^([鼠|牛|虎|兔|龙|蛇|马|羊|猴|鸡|狗|猪|蓝|绿|红|零|一|二|三|四|五|六|七|八|九|十|百|千|尾|0|1|2|3|4|5|6|7|8|9]{1,})((?!鼠|牛|虎|兔|龙|蛇|马|羊|猴|鸡|狗|猪|蓝|绿|红|零|一|二|三|四|五|六|七|八|九|十|百|千|尾)[\x{4e00}-\x{9fa5}|\^|$|…|(|\.|.|\*|\+|\-|\?|\=|\!|\:|:|\||\|\(|\)|\[|\]|\{|\}\,|,|。|!|、|\s|\/]){1,}$/u';


$preg = '/^((?!鼠|牛|虎|兔|龙|蛇|马|羊|猴|鸡|狗|猪|蓝|绿|红|零|一|二|三|四|五|六|七|八|九|十|百|千|尾)[\x{4e00}-\x{9fa5}|\^|$|…|(|\.|.|\*|\+|\-|\?|\=|\!|\:|:|\||\|\(|\)|\[|\]|\{|\}\,|,|。|!|、|\s|\/]){1,}([鼠|牛|虎|兔|龙|蛇|马|羊|猴|鸡|狗|猪|蓝|绿|红|零|一|二|三|四|五|六|七|八|九|十|百|千|尾|0|1|2|3|4|5|6|7|8|9]{1,}.*)$/u';


分组或,分组中不分先后顺序,可用于未尾或开头,不用于中间
(([元|块|'.$sybdfh.']{0,})|(共{0,1}\d{0,}元{0,})|((?!鼠|牛|虎|兔|龙|蛇|马|羊|猴|鸡|狗|猪)[\x{4e00}-\x{9fa5}]){0,}){0,}


正则表达式必须要包含某字符串,但同时不包含另一字符串

//必须要包含“CSDN或网站”这个关键词但不能有“垃圾”或“无聊”这两个关键词。
$preg = '/^(?=.*?(CSDN|网站))(?!.*?(垃圾|无聊)).*$/u';

//必须同时包含“CSDN、网站”这个关键词但不能有“垃圾”或“无聊”这两个关键词。
//$preg = '/^(?=.*?(CSDN))(?=.*?(网站))(?!.*?(垃圾|无聊)).*$/u';

正则表达式匹配空行,下面的在sublime测试通过,如果要删除空行,只需要替换为空即可
^\s+\

相关阅读

如何更换本机DNS

计算机上网需要dns解析域名方可将域名和空间服务器上内容对应起来,所以能上网的计算机都要配置一个dns进行解析域名。不同网络不同地区使用的dns各不相同的,而这个dns是由您当前网络供应商提供,更改本机DNS可以测试域名解析和网站访问(通过以下操作后,域名解析正常,可以ping到域名对应的ip,以及网站可以正常访问,说明您本地网络供应商提供给您计算机上网的d…

了解详情 >>

SublimeText2.0.2完整的注册码及安装插件说明及…

注册码在help的EnterLicense中输入下面所有的字符,无须去空格和换行,所有的字符就是完整的注册码-----BEGINLICENSE-----AndrewWeberSingleUserLicenseEA7E-855605813A03DD5E4AD9E66C0EEB94BC99798F942194A602396E98E62C99794BB979FE9…

了解详情 >>

删除bom标签或者bom头的php代码

有时程序的逻辑代码完全没有一问题,但是就是运行的时候出错,如果出现这种情况,那么有可能就是文件中包含了bom头所导致的,下面给出了php去除bom头的源代码,只要把下面的代码放到一个php的文件中,并且改好目录,然后运行那个文件就可以了//此文件用于快速测试UTF8编码的文件是不是加了BOM,并可自动移除=&quot;.&quot;;//修改此行为需要检测的…

了解详情 >>

ueditor与umeditor编辑器的各浏览器的问题汇总

ueditor的[1.4.3.3PHP版本]UTF-8版的存在的问题1:当编辑器还没有来得及提示“本地保存成功”的就提交表单的话,那么将无法获取编辑器中的内容2:当同一个脚本中有两个UE编辑器时,如果复制一段纯文字到编辑器中,被复制的文字的第一行只显示下面的部分,上面的一部分被隐藏起来,这个现象至少在火狐43.01版本一直到47.02这些版本是至少存在的,火…

了解详情 >>

日期格式如何转换?

日期格式常用的有哪几种?常用的日期格式有YYYY/MM/DD和YYYY-MM-DD,中间的分隔符一般用英文输入法的反斜杠或者短横杠,其中的字母Y是year的简写,表示年,M是month的简写,表示月,D是day的简写,表示日,示例2020/01/01,2020-01-01在excel中如何设置日期格式?在某个单元格内输入上面示例中的任何一种日期格式之后,然后…

了解详情 >>

跳转关系与规则不符要怎么办?

为了能够把这个问题解释清楚,这里我用实例来给大家分析一下跳转关系与规则不符的这个问题,一:先来看一下我的新旧url新旧url链接文件:gaiban.txt中的内容域名/productshow.php?id=29域名/sbzsshow.php?id=29域名/productshow.php?id=2域名/cpzsshow.php?id=78二:再来看一下pro…

了解详情 >>

Copyright @ 2008-2019   www.sznest.net   All rights reserved  网巢网是一家专业为企业提供免费建站、自助建站的模板建站公司     友情链接:香港张元洪律师行   

微信

移动端

客服

顶部