PHP 正则表达式入门篇

 更新时间:2016年11月25日 15:50  点击:1688
文章来介绍关于正则表达式用法,今天我们来看看关于在php中与正则表达式的常用入门基础用法篇,有需要的朋友可以参考一下下哈。

参考效果图

介绍
 
       正则表达式,大家在开发中应该是经常用到,现在很多开发语言都有正则表达式的应用,比如javascript,java,.net,php等等,我今天就把我对正则表达式的理解跟大家唠唠,不当之处,请多多指教!
 
需要知道的术语——下面的术语你知道多少?
 
Δ  定界符
Δ  字符域
Δ  修饰符
Δ  限定符
Δ  脱字符
Δ  通配符(正向预查,反向预查)
Δ  反向引用
Δ  惰性匹配
Δ  注释
Δ  零字符宽
 
定位
 
       我们什么时候使用正则表达式呢?不是所有的字符操作都用正则就好了,php在某些方面用正则反而影响效率。当我们遇到复杂文本数据的解析时候,用正则是比较好的选择。
 
优点
 
      正则表达式在处理复杂字符操作的时候,可以提高工作效率,也在一定程度节省你的代码量。
 
缺点
 
       我们在使用正则表达式的时候,复杂的正则表达式会加大代码的复杂度,让人很难理解。所以我们有的时候需要在正则表达式内部添加注释。
 
通用模式

 
 ¤ 定界符,通常使用 "/"做为定界符开始和结束,也可以使用"#"。
  什么时候使用"#"呢?一般是在你的字符串中有很多"/"字符的时候,因为正则的时候这种字符需要转义,比如uri。
     使用"/"定界符的代码如下.

 代码如下 复制代码

$regex = '/^http://([w.]+)/([w]+)/([w]+).html$/i';
$str = 'http://www.youku.com/show_page/id_ABCDEFG.html';
$matches = array();

if(preg_match($regex, $str, $matches)){
    var_dump($matches);
}

echo "n";

    preg_match中的$matches[0]将包含与整个模式匹配的字符串。

    使用"#"定界符的代码如下.这个时候对"/"就不转义!

 代码如下 复制代码

$regex = '#^http://([w.]+)/([w]+)/([w]+).html$#i';
$str = 'http://www.youku.com/show_page/id_ABCDEFG.html';
$matches = array();

if(preg_match($regex, $str, $matches)){
    var_dump($matches);
}

echo "n";


  ¤ 修饰符:用于改变正则表达式的行为。

     我们看到的('/^http://([w.]+)/([w]+)/([w]+).html/i')中的最后一个"i"就是修饰符,表示忽略大小写,还有一个我们经常用到的是"x"表示忽略空格。

贡献代码:

 

 代码如下 复制代码

 

$regex = '/HELLO/';
$str = 'hello word';
$matches = array();

if(preg_match($regex, $str, $matches)){
    echo 'No i:Valid Successful!',"n";
}

if(preg_match($regex.'i', $str, $matches)){
    echo 'YES i:Valid Successful!',"n";
}


 

  ¤ 字符域:[w]用方括号扩起来的部分就是字符域。


  ¤ 限定符:如[w]{3,5}或者[w]*或者[w]+这些[w]后面的符号都表示限定符。现介绍具体意义。

     {3,5}表示3到5个字符。{3,}超过3个字符,{,5}最多5个,{3}三个字符。

     * 表示0到多个

     + 表示1到多个。


  ¤ 脱字符号

      ^:

          > 放在字符域(如:[^w])中表示否定(不包括的意思)——“反向选择”

          >  放在表达式之前,表示以当前这个字符开始。(/^n/i,表示以n开头)。

      注意,我们经常管""叫"跳脱字符"。用于转义一些特殊符号,如".","/"

 


通配符(lookarounds):断言某些字符串中某些字符的存在与否!
 
lookarounds分两种:lookaheads(正向预查 ?=)和lookbehinds(反向预查?<=)。
> 格式:
正向预查:(?=) 相对应的 (?!)表示否定意思
反向预查:(?<=) 相对应的 (?<!)表示否定意思
前后紧跟字符

 代码如下 复制代码

$regex = '/(?<=c)d(?=e)/';  /* d 前面紧跟c, d 后面紧跟e*/
$str = 'abcdefgk';
$matches = array();

if(preg_match($regex, $str, $matches)){
    var_dump($matches);
}

echo "n";

否定意义:

 代码如下 复制代码

$regex = '/(?<!c)d(?!e)/';  /* d 前面不紧跟c, d 后面不紧跟e*/
$str = 'abcdefgk';
$matches = array();

if(preg_match($regex, $str, $matches)){
    var_dump($matches);
}

echo "n";

 


>字符宽度:零
验证零字符代码

 代码如下 复制代码

$regex = '/HE(?=L)LO/i';
$str = 'HELLO';
$matches = array();

if(preg_match($regex, $str, $matches)){
    var_dump($matches);
}

echo "n";

打印不出结果!

 代码如下 复制代码

$regex = '/HE(?=L)LLO/i';
$str = 'HELLO';
$matches = array();

if(preg_match($regex, $str, $matches)){
    var_dump($matches);
}

echo "n";

 能打印出结果!

说明:(?=L)意思是HE后面紧跟一个L字符。但是(?=L)本身不占字符,要与(L)区分,(L)本身占一个字符。

 
捕获数据
 
没有指明类型而进行的分组,将会被获取,供以后使用。
> 指明类型指的是通配符。所以只有圆括号起始位置没有问号的才能被捕捉。

> 在同一个表达式内的引用叫做反向引用。
> 调用格式: 编号(如1)。

 代码如下 复制代码

$regex = '/^(Chuanshanjia)[ws!]+1$/';   
$str = 'Chuanshanjia thank Chuanshanjia';
$matches = array();

if(preg_match($regex, $str, $matches)){
    var_dump($matches);
}

echo "n";

 

> 避免捕获数据
   格式:(?:pattern)
   优点:将使有效反向引用数量保持在最小,代码更加、清楚。
 
>命名捕获组
   格式:(?P<组名>) 调用方式 (?P=组名)

 代码如下 复制代码

$regex = '/(?P<author>chuanshanjia)[s]Is[s](?P=author)/i';
$str = 'author:chuanshanjia Is chuanshanjia';
$matches = array();

if(preg_match($regex, $str, $matches)){
    var_dump($matches);
}

echo "n";

运行结果

 

惰性匹配(记住:会进行两部操作,请看下面的原理部分)

  格式:限定符?

     原理:先匹配"?"前面的部分,然后再匹配右侧表达式,右侧表达式匹配成功则整个匹配结束。

先看下面的两个代码:

代码1.

 代码如下 复制代码

$regex = '/(")[^1]+1/i';
$str = '"a""b""c""d"';
$matches = array();

if(preg_match($regex, $str, $matches)){
    var_dump($matches);
}

echo "n";

 

结果1.

 

代码2

 代码如下 复制代码

$regex = '/(")[^1]+?1/i';
$str = '"a""b""c""d"';
$matches = array();

if(preg_match($regex, $str, $matches)){
    var_dump($matches);
}

echo "n";

 结果2

 分析:
      比较两个正则表达式:第一个加了"?",第二个没有。
      结果:主要看第一个参数:第一个把所有字符打印了出来,第二个只打印了个""a"".
      结论:
           >>  首先满足(")[^1]+1条件的有
                    "a", "a""b","a""b""c", "a""b""c""d",   "b","b""c","b""c""d",     "c","c""d",     "d"
                  而第一个正则表达式却选择了最大的"a""b""c""d",说明非惰性匹配会把最大的匹配结果拿出来做比较。
          
           >>  第二个正则表达式:先匹配(")[^1]+,如果匹配成功,那么我们在匹配“?”右边的1,如果匹配成功,则整个匹配结束。
 
 其他案例:

 代码如下 复制代码
  "Oh, "my"  God" =====>   /(")([^1] | \1)*?(?<!\)1/i

 
 

正则表达式的注释
 
格式:(?# 注释内容)
用途:主要用于复杂的注释
 
 贡献代码:是一个用于连接MYSQL数据库的正则表达式

 代码如下 复制代码

$regex = '/
    ^host=(?<!.)([d.]+)(?!.)                 (?#主机地址)
|
    ([w!@#$%^&*()_+-]+)                       (?#用户名)
|
    ([w!@#$%^&*()_+-]+)                       (?#密码)
(?!|)$/ix';

$str = 'host=192.168.10.221|root|123456';
$matches = array();

if(preg_match($regex, $str, $matches)){
    var_dump($matches);
}

echo "n";

 

特殊字符 解释
* 0到多次
+ 1到多次还可以写成{1,}
? 0或1次
. 匹配除换行符外的所有单个的字符
w [a-zA-Z0-9_]
s 空白字符(空格,换行符,回车符)[tnr]
d [0-9]

利用php导出excel我们大多会直接生成 csv文件,这种方便快捷如果不是要求很高,完全可以利用csv 来实例了,

这是最简单的了

 代码如下 复制代码

<?php
header("Content-type:application/vnd.ms-excel");
header("Content-Disposition:attachment;filename=test_data.xls");

$tx=’表头’;  
echo   $tx."nn";  
//输出内容如下:  
echo   "姓名"."t";  
echo   "年龄"."t";  
echo   "学历"."t";  
echo   "n";  
echo   "张三"."t";  
echo   "25"."t";  
echo   "本科"."t";  
?>

如果你一定要输入xls标准的excel文件可参考下面方法

/**
 * 输出XLS的头信息
 * 注:使用此函数前后都不应有任何数据输出
 * @param $data Array 下载的数据 
 * @param $file_name String 下载的文件名
 */

 代码如下 复制代码

function outputXlsHeader($data,$file_name = 'export')
{
 header('Content-Type: text/xls');
 header ( "Content-type:application/vnd.ms-excel;charset=utf-8" );
 $str = mb_convert_encoding($file_name, 'gbk', 'utf-8');   
 header('Content-Disposition: attachment;filename="' .$str . '.xls"');     
 header('Cache-Control:must-revalidate,post-check=0,pre-check=0');       
 header('Expires:0');        
 header('Pragma:public');
 
 $table_data = '<table border="1">'; 

 foreach ($data as $line)        
 {
  $table_data .= '<tr>';
  foreach ($line as $key => &$item)
  {
   $item = mb_convert_encoding($item, 'gbk', 'utf-8');
   $table_data .= '<td>' . $item . '</td>';
  }
  $table_data .= '</tr>';
 }
 $table_data .='</table>';
 echo $table_data;   
 die();
}

 

下面还推荐一下第三方的做法

引用google code中推荐的小类库(大体同方法一,比较复杂点)

http://code.google.com/p/php-excel/downloads/list
 

PHPEXCEL 类库,功能强大,支持win Excel2003 ,Win Excel2007

本文章介绍一正则表达式的基础与在asp,php,javascript中这些常用到一些如何电话,手机,邮箱,正数,字母,用户名等正则,有需要的同学可以参考一下。

一些常用的正则表达式

“^d+$”  //非负整数(正整数 + 0)

“^[0-9]*[1-9][0-9]*$”  //正整数

“^((-d+)|(0+))$”  //非正整数(负整数 + 0)

“^-[0-9]*[1-9][0-9]*$”  //负整数

“^-?d+$”    //整数

“^d+(.d+)?$”  //非负浮点数(正浮点数 + 0)

“^(([0-9]+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*))$”  //正浮点数

“^((-d+(.d+)?)|(0+(.0+)?))$”  //非正浮点数(负浮点数 + 0)

“^(-(([0-9]+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*)))$”  //负浮点数

“^(-?d+)(.d+)?$”  //浮点数

“^[A-Za-z]+$”  //由26个英文字母组成的字符串

“^[A-Z]+$”  //由26个英文字母的大写组成的字符串

“^[a-z]+$”  //由26个英文字母的小写组成的字符串

“^[A-Za-z0-9]+$”  //由数字和26个英文字母组成的字符串

“^w+$”  //由数字、26个英文字母或者下划线组成的字符串

“^[w-]+(.[w-]+)*@[w-]+(.[w-]+)+$”    //email地址

“^[a-zA-z]+://(w+(-w+)*)(.(w+(-w+)*))*(?S*)?$”  //url

/^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$/ // 年-月-日

/^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$/ // 月/日/年

“^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$” //Emil

“(d+-)?(d{4}-?d{7}|d{3}-?d{8}|^d{7,8})(-d+)?” //电话号码

“^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5])$” //IP地址

匹配中文字符的正则表达式: [u4e00-u9fa5]

匹配双字节字符(包括汉字在内):[^x00-xff]

匹配空行的正则表达式:n[s| ]*r

匹配HTML标记的正则表达式:/<(.*)>.*</1>|<(.*) />/

匹配首尾空格的正则表达式:(^s*)|(s*$)

匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*

匹配网址URL的正则表达式:^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$

匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$

匹配国内电话号码:(d{3}-|d{4}-)?(d{8}|d{7})?

匹配腾讯QQ号:^[1-9]*[1-9][0-9]*$

javascript中应用

计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)

 代码如下 复制代码

String.prototype.len=function(){return this.replace([^x00-xff]/g,”aa”).length;}

匹配空行的正则表达式:n[s| ]*r

匹配HTML标记的正则表达式:/<(.*)>.*</1>|<(.*) />/

匹配首尾空格的正则表达式:(^s*)|(s*$)

应用:javascript中没有像vbscript那样的trim函数,我们就可以利用这个表达式来实现,如下:

 代码如下 复制代码

String.prototype.trim = function()
{
return this.replace(/(^s*)|(s*$)/g, “”);
}

利用正则表达式分解和转换IP地址:

下面是利用正则表达式匹配IP地址,并将IP地址转换成对应数值的Javascript程序:

 代码如下 复制代码

function IP2V(ip)
{
re=/(d+).(d+).(d+).(d+)/g //匹配IP地址的正则表达式
if(re.test(ip))
{
return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1
}
else
{
throw new Error(“Not a valid IP address!”)
}
}

不过上面的程序如果不用正则表达式,而直接用split函数来分解可能更简单,程序如下:

 代码如下 复制代码

var ip=”10.100.20.168″
ip=ip.split(“.”)
alert(“IP值是:”+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1))

匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*

匹配网址URL的正则表达式:http://([w-]+.)+[w-]+(/[w- ./?%&=]*)?

利用正则表达式去除字串中重复的字符的算法程序:[注:此程序不正确,原因见本贴回复]

 代码如下 复制代码

var s=”abacabefgeeii”
var s1=s.replace(/(.).*1/g,”$1″)
var re=new RegExp(“["+s1+"]“,”g”)
var s2=s.replace(re,”")
alert(s1+s2) //结果为:abcefgi

我原来在CSDN上发贴寻求一个表达式来实现去除重复字符的方法,最终没有找到,这是我能想到的最简单的实现方法。思路是使用后向引用取出包括重复的字符,再以重复的字符建立第二个表达式,取到不重复的字符,两者串连。这个方法对于字符顺序有要求的字符串可能不适用。

得用正则表达式从URL地址中提取文件名的javascript程序,如下结果为page1

 代码如下 复制代码

s=”http://www.111cn.net/nokia/5230/”
s=s.replace(/(.*/){0,}([^.]+).*/ig,”$2″)
alert(s)


php中正则函数和用法

preg_match()和preg_match_all()  
preg_quote()  
preg_split()  
preg_grep()  
preg_replace()
函数的具体使用,我们可以通过PHP手册来找到,下面分享一些平时积累的正则表达式:

匹配action属性

 以下为引用的内容:

 代码如下 复制代码
$str = '';  
    $match = '';  
    preg_match_all('/s+action="(?!http:)(.*?)"s/', $str, $match);  
    print_r($match); 

 

在正则中使用回调函数

 代码如下 复制代码

/**  
   * replace some string by callback function  
   *  
   */ 
  function callback_replace() {  
      $url = 'http://esfang.house.sina.com.cn';  
      $str = '';  
      $str = preg_replace ( '/(?<=saction=")(?!http:)(.*?)(?="s)/e', 'search($url, \1)', $str );  
        
      echo $str;  
  }  
    
  function search($url, $match){  
      return $url . '/' . $match;  
  } 
 

 

一些正则基本语法

x|y 匹配 x 或 y。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。
[xyz] 字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。
[^xyz] 负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。
[a-z] 字符范围。匹配指定范围内的任意字符。例如,'[a-z]' 可以匹配 'a' 到 'z' 范围内的任意小写字母字符。
[^a-z] 负值字符范围。匹配任何不在指定范围内的任意字符。例如,'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范围内的任意字符。
b 匹配一个单词边界,也就是指单词和空格间的位置。例如, 'erb' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
B 匹配非单词边界。'erB' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
cx 匹配由 x 指明的控制字符。例如, cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。
d 匹配一个数字字符。等价于 [0-9]。
D 匹配一个非数字字符。等价于 [^0-9]。
f 匹配一个换页符。等价于 x0c 和 cL。
n 匹配一个换行符。等价于 x0a 和 cJ。
r 匹配一个回车符。等价于 x0d 和 cM。
s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ fnrtv]。
S 匹配任何非空白字符。等价于 [^ fnrtv]。
t 匹配一个制表符。等价于 x09 和 cI。
v 匹配一个垂直制表符。等价于 x0b 和 cK。
w 匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。
W 匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。

本文章主要介绍了在php中的文章读取与写文件的操作,我们主要讲取三个函数file_get_contents,fwrite,file用法,然后简单说is_readable判断文件是否可写。

首先是一个文件看能不能读取(权限问题),或者存在不,我们可以用is_readable函数获取信息.:
php/func_filesystem_is_readable.htm">is_readable函数用法

 代码如下 复制代码

<?php
$file = "test.txt";
if(is_readable($file))
  {
  echo ("$file is readable");
  }
else
  {
  echo ("$file is not readable");
  }
?>

输出:

test.txt is readable


利用file_get_contents函数来读取文件,这个函数可以读取大数据量的文件,也可以读取远程服务器文件,但必须在php.ini开始allow_url_fopen = On否则此函数不可用。

 代码如下 复制代码

<?php

  $file = "filelist.php";

  if (file_exists($file) == false) {

  die('文件不存在');

}

$data = file_get_contents($file);

echo htmlentities($data);

?>

读取远程 文件,这是本教程这外的话题了。

 代码如下 复制代码

function vita_get_url_content($url) {
if(function_exists('file_get_contents')) {
$file_contents = file_get_contents($url);
} else {
$ch = curl_init();
$timeout = 5;
curl_setopt ($ch, curlopt_url, $url);
curl_setopt ($ch, curlopt_returntransfer, 1);
curl_setopt ($ch, curlopt_connecttimeout, $timeout);
$file_contents = curl_exec($ch);
curl_close($ch);
}
return $file_contents;
}

利用fread函数
来读取文件,这个函数可以读取指定大小的数据量
//fread读取文件实例一

 代码如下 复制代码

$filename = "/www.111cn.net/local/something.txt";
$handle = fopen($filename, "r");
$contents = fread($handle, filesize($filename));
fclose($handle);

//php5以上版本读取远程服务器内容

 代码如下 复制代码

$handle = fopen("http://www.111cn.net/", "rb");
$contents = stream_get_contents($handle);
fclose($handle);


还有一种方式,可以读取二进制的文件:

 代码如下 复制代码

$data = implode('', file($file));


fwrite 文件的写操作

fwrite() 把 string 的内容写入文件指针 file 处。 如果指定了 length,当写入了 length 个字节或者写完了 string 以后,写入就会停止,视乎先碰到哪种情况。

fwrite() 返回写入的字符数,出现错误时则返回 false。

文件写入函式:

 代码如下 复制代码
<?php
//文件写入函式
function PHP_Write($file_name,$data,$method="w") {
$filenum=@fopen($file_name,$method);
flock($filenum,LOCK_EX);
$file_data=fwrite($filenum,$data);
fclose($filenum);
return $file_data;
}
?>
文章收藏了关于php 正则表达式用法与常用的正则表达式规则与实例,有需要的同学可以参考一下本文章。

正则表达式(Regular Expression)

 

正则表达式系统:

  1.POSIX

  2.Perl

 

PHP中使用的regex是PCRE:

  NOTE:PCRE(Perl兼容正则表达式,Perl Compatible Regular Expressions)

 

PCRE语法:

  1.定界符

    必须成对出现,可以使用除0-9a-zA-Z以外的任何字符

  2.原子

    1.正则需要匹配的可见和不可见字符都是原子

    2.一个正则表达式最少含有一个原子

    3.当需要匹配诸如"("、"["、"^"等含有语义的符号时需要用""反斜线进行转义

 

    原子字符:

      f 匹配换页符

      n 匹配换行符

      r 匹配回车符

      t 匹配制表符

      v 匹配垂直制表符

 

  3.元字符

     转义字符

    ^ 匹配字符串起始处

    $ 匹配字符串末尾

    . 匹配除"n"之外的任何单个字符

 

    * 匹配前面的子表达式0或多次

    + 匹配前面的子表达式1次或多次

    ? 匹配前面的子表达式0次或1次

 

    {n} 匹配n次

    {n,} 匹配n次或n次以上

    {n,m} 最少匹配n次至多匹配m次,(n<=m)

 

    [] 中括号代表原子表,中间的原子地位都是相等。在匹配的时候,匹配表中的任意一个字符

    [^] 抑扬符,排除后面的原子表所包含的字符。

 

    (pattern) 匹配pattern并获取这一匹配。

    num 对获取的第num个匹配的引用。

 


    (?:pattern) 匹配pattern但不获取这一匹配

 

    (?=pattern) 正向肯定预查,非获取匹配,例如:windows(?=XP|7)能匹配windowsXP中的windows不能匹配windows98中的windows

    (?!=pattern) 正向否定欲查非获取匹配,例如:windows(?!98|2000),能匹配windowsXP中的windows,不能匹配windows98中的windows

    (?<=pattern) 反向肯定预查,非获取匹配。例如:(?<=My|Postgre)SQL能匹配MySQL中的SQL,不能匹配MSSQL中的SQL

    (?<!pattern) 反向否定预查,非获取匹配。例如:(?<!My|Postgre)SQL能匹配MSSQL中的SQL,不能匹配MySQL中的SQL

 

    b 匹配单词边界

    B 匹配除单词边界以外的字符

    

    d 匹配任何一个数字。等价于[0-9]

    D 匹配任何一个非数字以外的字符。等价于[^0-9]

 

    s 匹配任何一个空白字符(包括空格、制表符、换页符等)。等价于[fnrtv]

    S 匹配任何一个非空白字符。等价于[^fnrtv]

    

    w 匹配任何一个数字、字母或下划线。等价于[0-9a-zA-Z]

    W 匹配任何一个非数字、字母或下划线的字符。等价于[^0-9a-zA-Z]

 

4.模式修正符

  i 不区分大小写

  m 此模式中如果有回车或换行,^和$将匹配每行的行首和行尾

  s 让.能匹配n

  x 忽略空白

  U 取消贪婪,相当于(.*?)

  A 与^效果一样

  D 结尾处不忽略回车  ,在结束处有$符的时候,在匹配的字符串后面加上回车,$依然能够匹配它成功。但是加上D之后,结尾的回车,不再匹配

 

    NOTE:正则表达式是从左向右进行匹配的

 

 常用的正则表达式
    1、非负整数:”^d+$”

    2、正整数:”^[0-9]*[1-9][0-9]*$”

    3、非正整数:”^((-d+)|(0+))$”

    4、负整数:”^-[0-9]*[1-9][0-9]*$”

    5、整数:”^-?d+$”

    6、非负浮点数:”^d+(.d+)?$”

    7、正浮点数:”^((0-9)+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*))$”

    8、非正浮点数:”^((-d+.d+)?)|(0+(.0+)?))$”

    9、负浮点数:”^(-((正浮点数正则式)))$”

    10、英文字符串:”^[A-Za-z]+$”

    11、英文大写串:”^[A-Z]+$”

    12、英文小写串:”^[a-z]+$”

    13、英文字符数字串:”^[A-Za-z0-9]+$”

    14、英数字加下划线串:”^w+$”

    15、E-mail地址:”^[w-]+(.[w-]+)*@[w-]+(.[w-]+)+$”

    16、URL:”^[a-zA-Z]+://(w+(-w+)*)(.(w+(-w+)*))*(?s*)?$”


下面这个用PHP写的函数,可以获取任意的字符串$string中的所有链接地址($string可以是从一个HTML页面文件直接读取出来的字符串),结果保存在一个数组中返回.该函数自动把电子邮件地址排除在外,而且返回的数组中不会有重复元素.

 

 代码如下 复制代码

function GetAllLink($string)
{
$string = str_replace("r","",$string);
$string = str_replace("n","",$string);

$regex[url] = "((http|https|ftp|telnet|news)://)?([a-z0-9_-/.]+.[][a-z0-9:;&#@=_~%?/.,+-]+)";
$regex[email] = "([a-z0-9_-]+)@([a-z0-9_-]+.[a-z0-9-._-]+)";

//去掉标签之间的文字
$string = eregi_replace(">[^<>]+<","><", $string);

//去掉JAVASCRIPT代码
$string = eregi_replace("<!--.*//-->","", $string);

//去掉非<a>的HTML标签

 代码如下 复制代码

$string = eregi_replace("<[^a][^<>]*>","", $string);

//去掉EMAIL链接
$string = eregi_replace("<a([ ]+)href=(["']*)mailto:($regex[email])(["']*)[^>]*>","", $string);

//替换需要的网页链接
$string = eregi_replace("<a([ ]+)href=(["']*)($regex[url])(["']*)[^>]*>","\3t", $string);

$output[0] = strtok($string, "t");
while(($temp = strtok("t")))
{
if($temp && !in_array($temp, $output))
$output[++$i] = $temp;
}

return $output;
}


以下是以PHP的语法所写的示例
验证字符串是否只含数字与英文,字符串长度并在4~16个字符之间

 代码如下 复制代码

<?php
$str = 'a1234';
if (preg_match("^[a-zA-Z0-9]{4,16}$", $str)) {
echo "验证成功";} else {
echo "验证失??quot;;}?>

简易的台湾身分证字号验证

 代码如下 复制代码

<?php
$str = 'a1234';
if (preg_match("^(?:d{15}|d{18})$", $str)) {
echo "验证成功";
} else {
echo "验证失??quot;;}
?>


下面的代码实现文字中的代码块,功能就如你在脚本之家看到的代码一样。

 代码如下 复制代码

function codedisp($code) {
global $discuzcodes;
$discuzcodes['pcodecount']++;
$code = htmlspecialchars(str_replace('\"', '"', preg_replace("/^[nr]*(.+?)[nr]*$/is", "\1", $code)));
$discuzcodes['codehtml'][$discuzcodes['pcodecount']] = "<br><div class="msgheader"><div class="right"><a href="###" class="smalltxt" onclick="copycode($('phpcode$discuzcodes[codecount]'));">[复制此代码]</a></div>代码如下:</div><div class="msgborder" id="phpcode$discuzcodes[codecount]">".fhtml2($code)."</div><br>";
$discuzcodes['codecount']++;
return "[tDISCUZ_CODE_$discuzcodes[pcodecount]t]";
}
$message = preg_replace("/s*[code](.+?)[/code]s*/ies", "codedisp('\1')", $message);
$message = preg_replace("/s*[html](.+?)[/html]s*/ies", "htmldisp('\1')", $message);

[!--infotagslink--]

相关文章

  • PHP正则表达式取双引号内的内容

    取双引号内的内容我们如果一个字符串中只有一个可以使用explode来获得,但如果有多个需要使用正则表达式来提取了,具体的例子如下。 写程序的时候总结一点经验,如何只...2016-11-25
  • 一个关于JS正则匹配的踩坑记录

    这篇文章主要给大家介绍了一个关于JS正则匹配的踩坑记录,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-04-13
  • PHP正则表达式之捕获组与非捕获组

    今天遇到一个正则匹配的问题,忽然翻到有捕获组的概念,手册上也是一略而过,百度时无意翻到C#和Java中有对正则捕获组的特殊用法,搜索关键词有PHP时竟然没有相关内容,自己试了一下,发现在PHP中也是可行的,于是总结一下,分享的同...2015-11-08
  • php 验证只能输入汉字、英语、数字的正则表达式

    正则表达式是一门非常有用的并且进行模糊判断的一个功能了,我们下面来看通过正则来验证输入汉字、英语、数字,具体如下。 收藏了正则表达式。可以验证只能输入数...2016-11-25
  • java正则表达式判断前端参数修改表中另一个字段的值

    这篇文章主要介绍了java正则表达式判断前端参数修改表中另一个字段的值,需要的朋友可以参考下...2021-05-07
  • 常用的日期时间正则表达式

    常用的日期时间正则表达式 下面收藏了大量的日期时间正则匹配函数,包括分钟,时间与秒都能达到。 正则表达式 (?n:^(?=d)((?<day>31(?!(.0?[2469]|11))|30(?!.0?2)|29(...2016-11-25
  • PHP正则表达式匹配验证提取网址URL实例总结

    网址规则是可寻的,所以我们可以使用正则表达式来提取字符串中的url地址了,下面一起来看看小编整理的几个PHP正则表达式匹配验证提取网址URL实例. 匹配网址 URL 的...2016-11-25
  • 正则表达式中两个反斜杠的匹配规则详解

    这篇文章主要介绍了正则表达式中两个反斜杠的匹配规则,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-05-07
  • JS中使用正则表达式g模式和非g模式的区别

    这篇文章给大家详细介绍了JS中使用正则表达式g模式和非g模式的区别,非常不错,具有参考借鉴价值,需要的朋友参考下吧...2017-04-03
  • JavaScript利用正则表达式替换字符串中的内容

    本文主要介绍了JavaScript利用正则表达式替换字符串中内容的具体实现方法,并做了简要注释,便于理解。具有一定的参考价值,需要的朋友可以看下...2017-01-09
  • C#正则表达式使用方法示例

    这篇文章主要介绍了C#正则表达式使用方法,大家参考使用...2020-06-25
  • 常用C#正则表达式汇总介绍

    c#正则表达式,用于字符串处理、表单验证等场合,实用高效。现将一些常用的表达式收集于此,以备不时之需。...2020-06-25
  • 一文秒懂python正则表达式常用函数

    这篇文章主要介绍了python正则表达式常用函数及使用方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-05-07
  • Idea使用正则表达式批量替换字符串的方法

    这篇文章给大家介绍了Idea使用正则表达式批量替换字符串的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧...2021-07-21
  • js正则学习小记之匹配字符串字面量

    关于匹配字符串问题,有很多种类型,今天讨论 js 代码里的字符串匹配,因为我想学完之后写个语法高亮练手,所以用js代码当作例子...2021-05-07
  • PHP正则表达式之捕获组与非捕获组

    今天遇到一个正则匹配的问题,忽然翻到有捕获组的概念,手册上也是一略而过,百度时无意翻到C#和Java中有对正则捕获组的特殊用法,搜索关键词有PHP时竟然没有相关内容,自己试了一下,发现在PHP中也是可行的,于是总结一下,分享的同...2015-11-08
  • C# 中使用正则表达式匹配字符的含义

    正则表达式的作用用来描述字符串的特征。本文重点给大家介绍C# 中使用正则表达式匹配字符的含义,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧...2020-06-25
  • Python验证的50个常见正则表达式

    这篇文章主要给大家介绍了关于利用Python验证的50个常见正则表达式的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-11
  • C#编程自学之运算符和表达式

    这篇文章主要介绍了C#运算符和表达式,这是自学C#编程的第五篇,希望对大家的学习有所帮助。...2020-06-25
  • PHP正则表达式过滤html标签属性(DEMO)

    这篇文章主要介绍了PHP正则表达式过滤html标签属性的相关内容,实用性非常,感兴趣的朋友参考下吧...2016-05-06