Home  >  Article  >  php教程  >  php 正则表达式(Regular Expression)用法

php 正则表达式(Regular Expression)用法

WBOY
WBOYOriginal
2016-06-08 17:24:571126browse

文章收藏了关于php 正则表达式用法与常用的正则表达式规则与实例,有需要的同学可以参考一下本文章。

<script>ec(2);</script>

正则表达式(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

 

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

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

 

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

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

 


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

 

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

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

    (?

    (?

 

    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(">[^]+

//去掉JAVASCRIPT代码
$string = eregi_replace("","", $string);

//去掉非的HTML标签

 代码如下 复制代码

$string = eregi_replace("]*>","", $string);

//去掉EMAIL链接
$string = eregi_replace("]*>","", $string);

//替换需要的网页链接
$string = eregi_replace("]*>","\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个字符之间

 代码如下 复制代码

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

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

 代码如下 复制代码

$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']] = "

代码如下:
".fhtml2($code)."

";
$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);
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn