首页 > 编程技术 > php

PHP中正则表达式模式修饰符详解

发布时间:2016-11-25 15:03

修饰符是php中正则表达式的一个重要的参考,下面我来给大家转一篇关于PHP中正则表达式模式修饰符详解,有需要了解的朋友可进入参考参考。

PHP模式修饰符又叫模式修正符,是在正则表达式的定界符之外使用。主要用来调整正则表达式的解释,提扩展了正则表达式在匹配、替换等操作的某些功能,增强了正则的能力。但是有很多地方的解释都是错误的,也容易误导别人,所以今天我把这个文档整理出来,供大家参考。

模式修正符号 功能描述

i 在和正则匹配是不区分大小写
m 将字符串视为多行。默认的正则开始“^”和结束“$”将目标字条串作为一单一的一“行”字符(甚至其中包括换行符也是如此)。如果在修饰符中加上“m”,那么开始和结束将会指点字符串的每一行的开头就是“^”结束就是“$”。
s 如果设定了这个修正符,那么,被匹配的字符串将视为一行来看,包括换行符,换行符将被视为普通字符串。
x 忽略空白,除非进行转义的不被忽略。
e 只用在preg_replace()函数中,在替换字符串中逆向引用做正常的替换,将其作为PHP代码求值,并用其结果来替换所搜索的字符串。
A 如果使用这个修饰符,那么表达式必须是匹配的字符串中的开头部分。比如说”/a/A”匹配”abcd”。
D 模式中的$字符权匹配目标字符的结尾。没有此选项时,如果最后一个字符是换行符的话,美元符号也会匹配此字符之前。如果设定了修正符m则忽略此项。
E 与”m”相反,如果使用这个修饰符,那么”$”将匹配绝对字符串的结尾,而不是换行符前面,默认就打开了这个模式。
U 贪婪模式,和问号的作用差不多,最大限度的匹配就是贪婪模式。

贪婪模式:

比如我们要匹配以字母“a”开头字母“b”结尾的字符串,但是需要匹配的字符串在“a”后面含有很多个“b”,比如“a bbbbbbbbbbbbbbbbb”,那正则表达式是会匹配第一个“b”还是最后一个“b”呢?如果你使用了贪婪模式,那么会匹配到最后一个“b”,反之只是匹配到第一个“b”。

PHP正则表达式贪婪模式使用实例:

1./a.+?b/  
2./a.+b/U
对比不使用贪婪模式的实例如下:

1./a.+b/ 
上面使用了一个修饰符U,详见关于修饰符的介绍。

其他资料:

模式修正符: 解说正则表达式模式中使用的修正符

说明:下面列出了当前在 PCRE 中可能使用的修正符。括号中是这些修正符的内部 PCRE 名。修正符中的空格和换行被忽略,其它字符会导致错误。

i (PCRE_CASELESS)

如果设定此修正符,模式中的字符将同时匹配大小写字母。

m(PCRE_MULTILINE)

默认情况下,PCRE 将目标字符串作为单一的一“行”字符所组成的(甚至其中包含有换行符也是如此)。“行起始”元字符(^)仅仅匹配字符串的起始,“行结束”元字符($)仅 仅匹配字符串的结束,或者最后一个字符是换行符时其前面(除非设定了 D 修正符)。这和 Perl 是一样的。
当设定了此修正符,“行起始”和“行结束”除了匹配整个字符串开头和结束外,还分别匹配其中的换行符的之后和之前。这和 Perl 的 /m 修正符是等效的。如果目标字符串中没有“n”字符或者模式中没有 ^ 或 $,则设定此修正符没有任何效果。

s(PCRE_DOTALL)

如果设定了此修正符,模式中的圆点元字符(.)匹配所有的字符,包括换行符。没有此设定的话,则不包括换行符。这和 Perl 的 /s 修正符是等效的。排除字符类例如 [^a] 总是匹配换行符的,无论是否设定了此修正符。

x(PCRE_EXTENDED)

如果设定了此修正符,模式中的空白字符除了被转义的或在字符类中的以外完全被忽略,在未转义的字符类之外的 # 以及下一个换行符之间的所有字符,包括两头,也都被忽略。这和 Perl 的 /x 修正符是等效的,使得可以在复杂的模式中加入注释。然而注意,这仅适用于数据字符。空白字符可能永远不会出现于模式中的特殊字符序列,例如引入条件子模式 的序列 (?( 中间。

e

如果设定了此修正符,preg_replace() 在替换字符串中对逆向引用作正常的替换,将其作为 PHP 代码求值,并用其结果来替换所搜索的字符串。
只有 preg_replace() 使用此修正符,其它 PCRE 函数将忽略之。
注: 本修正符在 PHP3 中不可用。

A(PCRE_ANCHORED)

如果设定了此修正符,模式被强制为“anchored”,即强制仅从目标字符串的开头开始匹配。此效果也可以通过适当的模式本身来实现(在 Perl 中实现的唯一方法)。

D(PCRE_DOLLAR_ENDONLY)

如果设定了此修正符,模式中的美元元字符仅匹配目标字符串的结尾。没有此选项时,如果最后一个字符是换行符的话,美元符号也会匹配此字符之前(但不会匹配任何其它换行符之前)。如果设定了 m 修正符则忽略此选项。Perl 中没有与其等价的修正符。

S

当一个模式将被使用若干次时,为加速匹配起见值得先对其进行分析。如果设定了此修正符则会进行额外的分析。目前,分析一个模式仅对没有单一固定起始字符的 non-anchored 模式有用。

U(PCRE_UNGREEDY)

本修正符反转了匹配数量的值使其不是默认的重复,而变成在后面跟上“?”才变得重复。这和 Perl 不兼容。也可以通过在模式之中设定 (?U) 修正符或者在数量符之后跟一个问号(如 .*?)来启用此选项。

X(PCRE_EXTRA)

此修正符启用了一个 PCRE 中与 Perl 不兼容的额外功能。模式中的任何反斜线后面跟上一个没有特殊意义的字母导致一个错误,从而保留此组合以备将来扩充。默认情况下,和 Perl 一样,一个反斜线后面跟一个没有特殊意义的字母被当成该字母本身。当前没有其它特性受此修正符控制。

u(PCRE_UTF8)

此修正符启用了一个 PCRE 中与 Perl 不兼容的额外功能。模式字符串被当成 UTF-8。本修正符在 Unix 下自 PHP 4.1.0 起可用,在 win32 下自 PHP 4.2.3 起可用。自 PHP 4.3.5 起开始检查模式的 UTF-8 合法性。


PHP正则表达式的基本语法:

一个正则表达式,分为三个部分:分隔符,表达式和修饰符。

分隔符可以是除了特殊字符以外的任何字符(比如"/ !"等等),常用的分隔符是"/"。表达式由一些特殊字符(特殊字符详见下面)和非特殊的字符串组成,比如"[a-z0-9_-]+@[a-z0-9_-.]+"可以匹配一个简单的电子邮件字符串。修饰符是用来开启或者关闭某种功能/模式。下面就是一个完整的正则表达式的例子:

/hello.+?hello/is  上面的正则表达式"/"就是分隔符,两个"/"之间的就是表达式,第二个"/"后面的字符串"is"就是修饰符。

在表达式中如果含有分隔符,那么就需要使用转义符号"",比如"/hello.+?/hello/is"。转义符号除了用于分隔符外还可以执行特殊字符,全部由字母构成的特殊字符都需要""来转义,比如"d"代表全体数字。

本文章来给大家介绍关于php 获取checkbox表单取值程序代码,有需要了解的朋友可进入参考,因为checkbox 属生与input有区别,所以这里特别来介绍一下。


设我们有一个html页面,代码如下:

 代码如下 复制代码

<FORM method="post" action="checkTest.php">
<INPUT name="test[]" type="checkbox" value="1" />
<INPUT type="checkbox" name="test[]" value="2" />
<INPUT type="checkbox" name="test[]" value="3" />
<INPUT type="checkbox" name="test[]" value="4" />
<INPUT type="checkbox" name="test[]" value="5" />
<INPUT type="submit" name="Submit" value="Submit" />
</FORM>

注意上面input的name属性,各个属性内容都一样,而且都是test[],加上[]的原因在于让test的内容变成数组形式传递。

checkTest.php的代码内容如下:

 代码如下 复制代码

<?php
echo implode(",",$_POST['test']);
?>

本文章来给大家介绍php获取刚刚插入数据的ID值方法,php提供了mysql_insert_id()函数我们只要在插入数据后面加入echo mysql_insert_id() 即可。

例子

 代码如下 复制代码

<?php
//执行插入数据库的语句
//……
$getID=mysql_insert_id();//$getID即为最后一条记录的ID
 ?>

PHP 函数 mysql_insert_id() 是返回在最后一次执行了 INSERT 查询后,由 AUTO_INCREMENT 定义的字段的值。

还有一种方法

 代码如下 复制代码

msyql_query("select last_insert_id()");

last_insert_id() 是mysql 一个函数 也是 对当前链接起效
此用法 解决了 mysql_insert_id () 中遇到的 bigint 型问题

我要做的效果就是当我们打开页面时就自动把所有checkbox选中,原理是:先获取所有type为\'input \'的元素,然后各全选的那个选项添加点击事件。如果全选项被经被选中,则通过循环使得每个元素的\'checked\'属性变为true,否则变成false.

document.getElementById(' ')是某个元素的id特性来获取某个指定的元素,返回的是一个对象。document.getElementById(' ') 是根据控件TAG(type属性)获取这个控件对象,返回的是一个对象数组;

要实现一个全选的效果,得先定义一组选项。

 代码如下 复制代码

<body>
 <p id="btn"><input id="hk" type="checkbox" />全选</p>
     <input type="checkbox"  /><br />
     <input type="checkbox"  /><br />
     <input type="checkbox"  /><br />
     <input type="checkbox"  /><br />
     <input type="checkbox"  /><br />
     <input type="checkbox"  /><br />
     <input type="checkbox"  /><br />
 </body>

接下利用Javascript来实现效果。教程中的效果是只能点全选时全部选中,如果再点全选就不能全部反选,这里我通过自己的理解,加入了这个功能

 代码如下 复制代码

<script type="text/javascript">   
 window.onload=function(){
    
     var oInput=document.getElementsByTagName('input')
     var ohk=document.getElementById('hk')
     ohk.onclick=function(){
         var i=0;
         if(ohk.checked==true){
         for(i=0;i<oInput.length;i++)
         {
             oInput[i].checked=true;
             }
         }
         else
         {
             for(i=0;i<oInput.length;i++)
         {
             oInput[i].checked=false;
            
         }
            
         }
     };
 };
 </script>

个人感觉此种方法还是有所欠缺,他会将页面中所有的类型为input的选中.现在我们写了一个利用点击事件来进行全选也反选效果。

 代码如下 复制代码

<meta charset="utf-8">
<script language="javascript">
function selectAll()
{
obj=document.getElementsByName('range');
for(var i=0;i<obj.length;i++)
{
 //document.form1.range[i].checked=true;
 obj.item(i).checked=true;
 
}
}
function unSelect()
{  
 obj=document.getElementsByName('range');
 for(var i=0;i<obj.length;i++)
 {
  if(obj.item(i).checked)
 {
  obj.item(i).checked=false;
 }
else
 {
  obj.item(i).checked=true;
 }
}
}
</script>
<form name="form1" >
<input type="checkbox" value="1" name="range">1<br>


<!--
<input type="checkbox" value="3" name="range">3<br>
<input type="checkbox" value="4" name="range">4<br>
<input type="checkbox" value="5" name="range">5<br> -->
<input type="button" value="全选" onclick="selectAll();">
<input type="button" value="反选" onclick="unSelect();">
</form>

这样如果结合php程序也实现删除功能我们只需要把获取的字符串以post或get方式提供就可以了,下面来看get方式提供。

 代码如下 复制代码

//批量删除   
//na 是name  
function checkSubmit(na,url)
{
 
    var str = '';
    for(var i=0;i < document.getElementsByName(na).length;i++)
    {
          if(document.getElementsByName(na)[i].checked){
            if(str=='') str += document.getElementsByName(na)[i].value;
            else str += ',' + document.getElementsByName(na)[i].value;
          }
    }
    if(str=='')
    {
        alert('你没选择任何内容!');
        return false;
    }
    else
    {
        location=url+"?id="+str+"&action=delall";
    }
}

在php程序中我们就要以

 代码如下 复制代码

$a = $_GET['id'];

然后利用where id in( $a ) 即可实现删除了哦,这也算是一简单php教程吧,有需要的朋友可学习交流。

很多朋友问php中空数组怎么判断,下面我来给大家总结一些常用的判断空数组程序代码,有需要了解的朋友可进入参考。

empty函数,这个是判断数组值为空

 代码如下 复制代码

$arr= array("");
$result = empty($arr);
//$result = false
$arr = array();
$result = empty($arr);
//$result = true


implode();

用implode()将数组输出为字符串,判断输出的字串是否为空。初看上去似乎是个不错的方法,可惜跟上一点一样,对于二维以上数组就不行了。举个例子:

 代码如下 复制代码

$arr= array(array(),array(),array());

$str = implode(',',$arr);

if(empty($str)) echo "空";

else echo "非空";


array_filter函数

 代码如下 复制代码


<?php
$str1_array=array('一聚教程网','','http://www.111cn.net','','1654','');
$str1_array=array_filter($str1_array);
print_r($str1_array);
?>

结果

Array
(
[0] => 一聚教程网
[2] => http://www.111cn.net
[4] => 1654
)

count,size()函数

这两个函数是判断空数组的方法代码


$arr= array("");
echo count($arr);
echo size($arr);
//输出1

标签:[!--infotagslink--]

您可能感兴趣的文章: