进一步的去了解正则[一]

1 正则是什么.
  请先看 http://www.phpchina.com/html/11/n-34811.html 几k 的解释后.

原地址已被更改,重新找了一个教程,请点击。 http://deerchao.net/tutorials/regex/regex.htm

2 实例剖析.
1.    $str = '<FORM&NBSP;NAME="ADFA"&NBSP;ACTION="ASDF.BPHP"&NBSP;TARGET=""><FORM&NBSP;NAME="BBBB"&NBSP;ACTION="HTTP: www.bac.com test.php? target="qwerqwerq"><FORM&NBSP;NAME="BBBB"&NBSP;ACTION="HTTP.PHP"&NBSP;TARGET="QWERQWERQ">'; 
2.        $match = ''; 
3.        preg_match_all('/\s+action=\"(?!http:)(.*?)\"\s/', $str,       $match); 
4.        print_r($match);
/\s+action=\"(?!http:)(.*?)\"\s/ 此正则是用来匹配 action=”xxx” 里面的xxx的.
可讲的地方有3
1  \”(.*?)\” 会匹配  aa”abb”aaaa”  字符串中的”abb””  而(.*)\” 则会去匹配aa”abb”aaaa”中的”abb”aaaa”. 此谓之贪婪(greedy) 特别实用。U 修正符可以反转正则式中的贪婪。
2 (?!http:) 代表将要匹配的内容中不含有http: 他本身不匹配内容.
例如 我要匹配一个 长为8-16里面不能有http 的字符串,就写 (?!http)\w{8-16} 即可。
3 就是这哥们匹配时,定死了action=” 后面的这个(“) 如果是 ‘ 号呢怎么办呢?
这里就要用到 反向引用了。
相关正则表达式如下。
(?<=\s*action=('|\"))(?!|http)(.*?)(?=\1)
  演化一下
最初的想法
  Action=\”(.*)\”  => 为能只匹配 action=”dddd” fdsfds” 中的action=”dddd”而不是action=”dddd” fdsfds” 更改为action=\”(.*?)\” =>要支持单引号action=(‘\”)(.*?)\1 => action 后面引号内不允许有http  action=(‘\”)(?!http:)(.*?)\1  => 只想提取引号内的内容,不想提取其它的内容. (?<=\s*action=('|\"))(?!http)(.*?)(?=\1)

文中还有两个例子挺实用的。
带断言的正则匹配
1.    $match = ''; 
2.       $str = '<A&NBSP;HREF="">xxxxxx.com.cn <b>ddddbolod</b>paragraph text
'; 
3.       preg_match_all ( '/(?<=<(\w{1})>).*(?=<\/\1>)/', $str, $match ); 
4.       echo "<BR&NBSP; />匹配没有属性的标签中的内容:"; 
5.       print_r ( $match );
正则式为(?<=<(\w{1})>).*(?=<\/\1>)
(?<=<(\w{1})>) 为逆向预匹配,就是说需要匹配的左边要满足这要求。
上php手册查了一下,preg_match_all("/(<([\w]+)[^>]*>)(.*?)(<\/\\2>)/", $html, $matches, PREG_SET_ORDER);

然后表大式可以更改为(?<=<(\w+)>).*(?=<\/\1>)
替换HTML源码中的地址  
1.    $form_html = preg_replace ( '/(?<=\saction=\"|\ssrc=\"|\shref=\")(?!http:|javascript)(.*?)(?=\"\s)/e', 'add_url(\$url, \'\\1\')', $form_html );
这个也是单双引号的问题,需要改改.

2 看完帖http://www.phpchina.com/html/03/n-34203.html
觉得
function is_good_pw($pw) {
    if(preg_match('/(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]).{8,16}/', $pw)) {
        return true;
    }
    return false;
}
可以吸收一下。下面我决定啰哩啰嗦的解试一下这个函数。
.{8-16} 代表匹配8-16位非换行字符串。
可是当我们需要这8-16 位的数字中,必须有数字,而且有小写字母,而且有大写字母时,正则表达式如何去写呢?

 (?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]).{8,16}
匹配 必须有数字,小写字母,大写之母的 的8-16 位的字符.
1 基础概念讲解.
  1 理解缝隙的概念.
    例如, "^","$","\b"。它们都有一个共同点,那就是:它们本身不匹配任何字符,只是对 "字符串的两头" 或者 "字符之间的缝隙" 附加了一个条件
 2  ?=xxx) 正向预搜索 代表缝隙的右侧,必须能够匹配上 xxxxx 这部分的表达式
 
那么
(?=.*[\d]).{8-16} 代表匹配含有数字的8-16位的字符串,
如果是(?=\d).{8-16}则匹配的内容为首位为数字的8-16 的字符串.
如果是(?=\d{2}).{8-16}则匹配的内容为前两位为数字的8-16 的字符串.
从这里看来,正向预搜索需要理解的就是(?=xxx) 本身是不匹配字符的,而是给右侧的字符串添加条件,目的就是要右侧的字符串能满足这个预搜索条件。

.{8-16}  代表任意非换行的8 位字符串.
(?=.*[\d]).{8-16} 代表任意非换行的8-16 位字符串,而且这8-16位字符串中有数字。
(?=.*[\d]) (?=.*[a-z]).{8-16}代表任意非换行的8-16 位字符串,而且这8-16位字符串中有数字,而且这8-16位字符串中有a-z 之间的字母.
这样看来(?=.*[\d]).{8-16}的(?=.*[\d])就是用来向.{8-16}来叠加规则的.*[\d] 的
(?=.*[a-z]) (?=.*[\d]).{8-16} 中的(?=.*[a-z])就是用来向(?=.*[\d]).{8-16}叠加(?=.*[a-z])规则。
这样下来,当我们需要匹配的8-16位中间有数字而且有大写字母而且有小写字母,的时修就用到了(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]).{8,16}

此时,我们能匹配8-16 位的数字中,必须有数字,而且有小写字母,而且有大写字母
这时,如果要被匹配的字符串中不能出现 http 这时怎么处理呢?
答案很简单 加个正向否定预搜索就可以了
(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?!http).{8,16}

下一个实例,货币替换.
1 理清思路,
货币替换对正则而言就是要找那些 距离结尾或[.] 隔着\d{3}+ 的\d
所以一开始就是(\d)(?=(\d{3})+($|\.\d*))
如果不希望回代后面的值,就用(\d)(?=(?:\d{3})+(?:$|\.\d*))
再补点预搜索条件(?=\d)(?!\.\d*) 是数字,而且不能以 .开头 最后就拼接成了.
(?<!\.\d*)(?=\d)(\d)(?=(?:\d{3})+(?:$|\.\d*))
附php代码.




<?php
$money_arr =  array(
    "0",
    "12",
    "123",
    "1234",
    "12345",
    "123456",
    "1234567",
    "123456789",
    "1234567890",
    "12.345",
    "123.456",
    "1234.56",
    "12345.6789",
    "123456.789",
    "1234567.89",
    "12345678.9",
    "sdsd12345678.9"
);
 
foreach($money_arr as $key=>$val)
{
    echo $val;
    $str = preg_replace("/(?=\d)(?!\.\d*)(\d)(?=(?:\d{3})+($|\.\d*))/","$1,",$val);
    echo "the replace result is";echo $str;
    echo "<hr/>";
}

function pr($arr){ //格式化输出数组.
    print("<pre>");print_r($arr);print("</pre>");
}
?>

下一例:
<img src=’xxx’>
<img src=’xxx’ />
<img src=’xxx’ > ddd</img>
当需要抓取这三种时,第三种的前面和第一种重复,则用 ? 来解决
<img[^>]>(.*<\/img>)? 即可

转载于:https://www.cnblogs.com/murain/archive/2010/03/31/1947265.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/476019.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 123. 买卖股票的最佳时机 III(动态规划)

1. 题目 给定一个数组&#xff0c;它的第 i 个元素是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。 注意: 你不能同时参与多笔交易&#xff08;你必须在再次购买前出售掉之前的股票&#xff09;。 示例 1: 输入: […

mysql异步复制参数_MySQL Replication(异步复制)基本原理

1、复制进程Mysql的复制(replication)是一个异步的复制&#xff0c;从一个Mysqlinstace(称之为Master)复制到另一个Mysqlinstance(称之Slave)。实现整个复制操作主要由三个进程完成的&#xff0c;其中两个进程在Slave(Sql进程和IO进程)&#xff0c;另外一个进程在Master(IO进程…

SQL Server 2005之PIVOT/UNPIVOT行列转换(转)

SQL Server2005引入了很多迎合开发者口味的新特性&#xff0c;虽然改动不大&#xff0c;却大大了减少了开发者的工作量&#xff0c;这种替用户考虑的开发思路&#xff0c;值得称赞。 在SQL Server2000中&#xff0c;要实现行列转换&#xff0c;需要综合利用聚合函数和动态SQL&a…

LeetCode 188. 买卖股票的最佳时机 IV(动态规划)

1. 题目 给定一个数组&#xff0c;它的第 i 个元素是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。 注意: 你不能同时参与多笔交易&#xff08;你必须在再次购买前出售掉之前的股票&#xff09;。 示例 1: 输入: [2…

mysql slow log 分析工具_mysql slow log分析工具的比较

mysql 中的 slow log 是用来记录执行时间较长(超过 long_query_time 秒)的 sql 的一种日志工具。启用 slow log在 my.cnf 中设置[mysqld]slow_query_logonslow_query_log_filemysql-slow重启 MySQL 服务。五款常用工具mysqldumpslowmysqlslamyprofimysql-explain-slow-logmysql…

利用寄存器进入栈值交换

代码 varA, B: Word;beginA :1; B :2; asmmov ax, a //赋值 mov bx, b push ax //进栈 push bx pop ax //退栈 pop bx mov a, ax //利用栈先进后出, ax已退栈, 寄存器里的值为原bx 的值 mov b, bx //利用栈先进后出, bx已退栈, 寄存…

LeetCode 309. 最佳买卖股票时机含冷冻期(动态规划)

1. 题目 给定一个整数数组&#xff0c;其中第 i 个元素代表了第 i 天的股票价格 。​ 设计一个算法计算出最大利润。在满足以下约束条件下&#xff0c;你可以尽可能地完成更多的交易&#xff08;多次买卖一支股票&#xff09;: 你不能同时参与多笔交易&#xff08;你必须在再…

mysql new map_使用构造器模式动态构建Map作为mybatis的查询条件

Map filter mapper.convertValue(this,Map.class);System.out.printf("查询条件:%s\n", JSON.toJSONString(filter));returnfilter;}//https://stackoverflow.com/questions/6796187/java-introspection-object-to-map/57057596#57057596public MaptoFilter2(){Map …

处理Excel,填充空白区域

在企业应用开发中经常是业务人员提供Excel的数据源&#xff0c;而开发人员将Excel数据导入到数据库中&#xff0c;然后在数据库中进行处理。在Excel中为了表示一种层次和所属关系&#xff0c;很多时候会产生很多空白的单元格。比如一个CRM数据&#xff0c;里面有销售团队、销售…

LeetCode 901. 股票价格跨度(单调栈)

1. 题目 编写一个 StockSpanner 类&#xff0c;它收集某些股票的每日报价&#xff0c;并返回该股票当日价格的跨度。 今天股票价格的跨度被定义为股票价格小于或等于今天价格的最大连续日数&#xff08;从今天开始往回数&#xff0c;包括今天&#xff09;。 例如&#xff0c…

今天动手熟悉了一下css和php

手又痒了&#xff0c;动了动css和php&#xff0c;复习了已经忘了很久的csshttp://www.the520.cn/files/cssstudy/转载于:https://www.cnblogs.com/x2048/articles/1793996.html

Python核心教程(第二版)读书笔记(三)

第三章Python基础 2010-04-09 换行 一行过长的语句可以使用反斜杠‘\’分解成几行。有两种例外情况一个语句不使用反斜线也可以跨行。 1、在使用闭合操作符时&#xff0c;单一语句可以跨多行。例如&#xff1a;在含有小括号、中括号、花括号时可以多行书写。 2、三引号包括下的…

mysql没有写入权限_MySQL的权限系统

一、MySQL权限系统一)MySQL权限系统介绍权限系统的作用&#xff1a;授予来自某个主机的某个用户可以查询、插入、修改、删除等数据库操作的权限不能明确指定拒绝某个用户的连接权限控制(授权与回收)的执行语句包括create user&#xff0c;grant&#xff0c;revoke授权后的权限都…

LeetCode 1300. 转变数组后最接近目标值的数组和(二分查找)

1. 题目 给你一个整数数组 arr 和一个目标值 target &#xff0c;请你返回一个整数 value &#xff0c; 使得将数组中所有大于 value 的值变成 value 后&#xff0c;数组的和 最接近 target &#xff08;最接近表示两者之差的绝对值最小&#xff09;。 如果有多种使得和最接近…

AJAX 弹出窗消息类

using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.IO;using System.Text;using System.Web.UI;namespace WebApplication{ /// <summary> /// 消息类 /// /// /// </summary> public class Me…

mysql 创建初始化帐号_MySQL创建SCOTT用户及初始化数据

表结构create table dept(-- 部门编号deptno int unsigned auto_increment primary key,-- 部门名称dname varchar(15) ,-- 部门所在位置loc varchar(50))engine InnoDB;create table emp(-- 雇员编号empno int unsigned auto_increment primary key,-- 雇员姓名ename varchar…

潜在语义分析(Latent Semantic Analysis,LSA)

文章目录1. 单词向量空间、话题向量空间1.1 单词向量空间1.2 话题向量空间2. 潜在语义分析算法2.1 例子3. 非负矩阵分解算法4. TruncatedSVD 潜在语义分析实践一种无监督学习方法&#xff0c;主要用于文本的话题分析其特点是通过矩阵分解发现文本与单词之间的基于话题的语义关系…

python分割提取字符串_Python 字符串操作(截取/替换/查找/分割)

python字符串连接先介绍下效率比较低的&#xff0c;有些新手朋友就会犯这个错误&#xff1a;a [a,b,c,d]content for i in a:content content iprint content说下为什么效率会低呢&#xff1f;原因&#xff1a;在循环连接字符串的时候&#xff0c;他每次连接一次&#xff0…

CURL详解[全]

PHP中的CURL函数库&#xff08;Client URL Library Function&#xff09;curl_close — 关闭一个curl会话curl_copy_handle — 拷贝一个curl连接资源的所有内容和参数curl_errno — 返回一个包含当前会话错误信息的数字编号curl_error — 返回一个包含当前会话错误信息的字符串…

基于sklearn.decomposition.TruncatedSVD的潜在语义分析实践

文章目录1. sklearn.decomposition.TruncatedSVD2. sklearn.feature_extraction.text.TfidfVectorizer3. 代码实践4. 参考文献《统计学习方法》潜在语义分析&#xff08;Latent Semantic Analysis&#xff0c;LSA&#xff09; 笔记 1. sklearn.decomposition.TruncatedSVD sk…