1. int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )

<?php
$title = "Replacement Canon BP-511 Camcorder Battery [Item ID:3-236-523]";
if( preg_match("/(\[Item ID:)([0-9]+)-([0-9]+)-([0-9]+)(])/i",$title,$arr) ){
echo "<pre>";
print_r($arr);
echo "</pre>";
}
?>
//返回结果是
Array
(
[0] => [Item ID:3-236-523]
[1] => [Item ID:
[2] => 3
[3] => 236
[4] => 523
[5] => ]
)
<?php
// 下面的例子演示了将文本中所有 <pre></pre> 标签内的关键字(php)显示为红色。
$str = "<pre>学习php是一件快乐的事。</pre><pre>所有的phper需要共同努力!</pre>";
$kw = "php";
preg_match_all('/<pre>([sS]*?)</pre>/', $str, $mat);
$length = count($mat[0]);
for ($i=0; $i<$length; $i++) {
$mat[0][$i] = $mat[1][$i];
$mat[0][$i] = str_replace($kw, '<span style="color:#ff0000">' . $kw . '</span>', $mat[0][$i]);
$str = str_replace($mat[1][$i], $mat[0][$i], $str);
}
echo $str;
?>

特点:返回0或1 ,仅对$subject 匹配一次,若符合 $pattern则返回1,否则返回0;

$matches:数组类型,$matches[0]:匹配到的全部字符,$matches[1]...:此内容是其字表达式内匹配到的字符串( );

preg_match() returns the number of times pattern matches. That will be either 0 times (no match) or 1 time because preg_match() will stop searching after the first match.

//实例
<?php
// 从 URL 中取得主机名 preg_match("/^(http:\/\/)?([^\/]+)/i",
"http://www.php.net/index.html", $matches);
$host = $matches[2]; echo $host;
// 从主机名中取得后面两段 preg_match("/[^\.\/]+\.[^\.\/]+$/", $host, $matches);
echo "domain name is: {$matches[0]}\n";
// 本例执行后将输出: domain name is: php.net ?>

2.  int preg_match_all ( string $pattern , string $subject [, array &$matches [, int $flags = PREG_PATTERN_ORDER [, int $offset = 0 ]]] )

Return Values  :Returns the number of full pattern matches (which might be zero), or FALSE if an error occurred.

<?php
preg_match_all ("|<[^>]+>(.*)</[^>]+>|U",
"<b>example: </b><div align=left>this is a test</div>",$out, PREG_PATTERN_ORDER); // 注意PREG_PATTERN_ORDER和PREG_SET_ORDER的区别 print $out[0][0].", ".$out[0][1]."\n";
print $out[1][0].", ".$out[1][1]."\n";
echo "<pre>";
print_r($out);
?>
//返回的结果
<b>example: </b>, <div align=left>this is a test</div>
example: , this is a test
<pre>Array
(
[0] => Array
(
[0] => <b>example: </b> //第一次匹配到的内容
[1] => <div align=left>this is a test</div> //第二次匹配到的内容
) [1] => Array
(
[0] => example: //第一次匹配到的值表达式的内容"(.*)"
[1] => this is a test//第二次匹配到的值表达式的内容"(.*)"
) )

与preg_match区别是:全部匹配 $subject,直到没有符合规则($pattern)为止。

注意PREG_PATTERN_ORDER和PREG_SET_ORDER的区别:

PREG_PATTERN_ORDER:将匹配的全部内容放在$match[0][] ; 将子表达式的内容放在 $match[1][];按序放置。

PREG_SET_ORDER  :将匹配到的内容和子表达式的内容放在同一维数组中 $match[][].

3.  preg_replace :按规则 搜索并替换。注意后向引用。

$subject = 'this hs 7 words and 31 letters';
$result = preg_replace(array('/\d+/','/[a-z]+/'), array('num<\0>','word<\0>'), $subject);
$result2 = preg_replace(array('/[a-z]+/','/\d+/'), array('word<\0>','num<\0>'), $subject); var_dump($result2); $string = "Is is the cost Of of gasoline going up up";
$pattern = "/\b([a-z]+) \\1\b/i"; //这里的\\1不能使用\$1或$1
$str = preg_replace($pattern, "\\1", $string); //这里的\\1可以使用\$1或$1,引用第一个子匹配
//echo $str; //效果是Is the cost of gasoline going up //数组形式每个pattern使用replacement中对应的 元素进行替换. 如果replacement中的元素比pattern中的少, 多出来的pattern使用空字符串进行替换.
$patterns = array('/(19|20\d{2})-(\d{1,2})-(\d{1,2})/', '/^\s*{(\w+)}\s*=/');
$replace = array('\\1/\\2/\\3', '$\\1 =');
print preg_replace($patterns, $replace, '{startDate} = 2010-6-19');//效果是$startDate = 2010/20/6 /*
"\\1/\\3/\\4"
\\1表示第一个匹配项年份即((19|20)\d{2})模式 结果为2010
\\3表示第三个匹配项月份即(\d{1,2})模式 结果为6
\\4表示第四个匹配项日即第二个(\d{1,2})模式 结果为19 */ $string = "April 15, 2003";
$pattern = "/(\w+) (\d+), (\d+)/i";
//$replacement = "\${1},\$3"; //第一种用法 美元符号\${1} 可以匹配后面跟数字的形式,\${1}2525;
//$replacement = "\\1,\\3"; //第二种用法 双引号用\\1
//$replacement = '\1,\3'; //第三种用法 单引号用 \1 //print preg_replace($pattern, $replacement, $string); /* Output
April1,2003 注:字符串单引号与双引号的区别,如果是双引号转义字符前要加\,例如:"\\1"='\1'。
*/
?>

4. preg_replace_callback : 执行一个正则表达式搜索并且使用一个回调进行替换

<?php
/* 一个unix样式的命令行过滤器, 用于将段落开始部分的大写字母转换为小写. */
$fp = fopen("php://stdin", "r") or die("can't read stdin");
while (!feof($fp)) {
$line = fgets($fp);
$line = preg_replace_callback(
'|<p>\s*\w|',
create_function(
// single quotes are essential here,
// or alternative escape all $ as \$
'$matches',
'return strtolower($matches[0]);'
),
$line
);
echo $line;
}
fclose($fp);
?>
<?php
// 将文本中的年份增加一年.
$text = "April fools day is 04/01/2002\n";
$text.= "Last christmas was 12/24/2001\n";
// 回调函数
function next_year($matches)
{
// 通常: $matches[0]是完成的匹配
// $matches[1]是第一个捕获子组的匹配
// 以此类推
return $matches[1].($matches[2]+1);
}
echo preg_replace_callback(
"|(\d{2}/\d{2}/)(\d{4})|",
"next_year",
$text); ?>

5. preg_split 使用正则分割。

PREG_SPLIT_NO_EMPTY
如果设定了本标记,则 preg_split() 只返回非空的成分。
PREG_SPLIT_DELIM_CAPTURE
如果设定了本标记,定界符模式中的括号表达式也会被捕获并返回。本标记添加于 PHP 4.0.5。
PREG_SPLIT_OFFSET_CAPTURE
如果设定了本标记,如果设定本标记,对每个出现的匹配结果也同时返回其附属的字符串偏移量。注意这改变了返回的数组的值,使其中的每个单元也是一个数组,其中第一项为匹配字符串,第二项为其在 subject 中的偏移量。本标记自 PHP 4.3.0 起可用。

php使用正则函数使用详解的更多相关文章

  1. Linq之旅:Linq入门详解(Linq to Objects)

    示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...

  2. 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)

    一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...

  3. EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解

    前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...

  4. Java 字符串格式化详解

    Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...

  5. Android Notification 详解(一)——基本操作

    Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...

  6. Android Notification 详解——基本操作

    Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...

  7. Git初探--笔记整理和Git命令详解

    几个重要的概念 首先先明确几个概念: WorkPlace : 工作区 Index: 暂存区 Repository: 本地仓库/版本库 Remote: 远程仓库 当在Remote(如Github)上面c ...

  8. Drawable实战解析:Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)

    Android XML shape 标签使用详解   一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...

  9. Node.js npm 详解

    一.npm简介 安装npm请阅读我之前的文章Hello Node中npm安装那一部分,不过只介绍了linux平台,如果是其它平台,有前辈写了更加详细的介绍. npm的全称:Node Package M ...

随机推荐

  1. 初步了解pandas(学习笔记)

    1 pandas简介 pandas 是一种列存数据分析 API.它是用于处理和分析输入数据的强大工具,很多机器学习框架都支持将 pandas 数据结构作为输入. 虽然全方位介绍 pandas API ...

  2. mysql合并binlog

    例如: PURGE MASTER LOGS BEFORE DATE_SUB( NOW( ), INTERVAL DAY);

  3. Android APK安装完成自动删除安装包

    需要实现此功能,一般实际开发是在自动版本更新上,当更新完开始自动安装完毕后,删除内存卡里的安装包.实现方式很简单,监听应用广播,获取内存卡下的文件,删除! 1.监听广播 package com.exa ...

  4. Leetcode 编程训练

    Leetcode这个网站上的题都是一些经典的公司用来面试应聘者的面试题,很多人通过刷这些题来应聘一些喜欢面试算法的公司,比如:Google.微软.Facebook.Amazon之类的这些公司,基本上是 ...

  5. keras 类似问题解决:model找不到,或者无法下载

    Applications Keras Applications are deep learning models that are made available alongside pre-train ...

  6. 解决 p0sixspwn-v1.0.4 win版 无法定位程序输入点sqlite3_wal_checkpoint的问题

    p0sixspwn-v1.0.4 win版今天早晨发现大神( @winocm · @iH8sn0w · @SquiffyPwn) 已经发布. 下载下来运行之,发现会报错: 无法定位程序输入点sqlit ...

  7. Oozie-coordinator调度

    当有一个复杂的工作流job,希望每天定时执行,使用crontab方式调用需要编写大量的脚本,还要通过大量的判断来控制每个工作流job的执行顺序问题.Oozie中的Coordinator可以让每个工作流 ...

  8. Java:多线程,Exchanger同步器

    1. 背景 类java.util.concurrent.Exchanger提供了一个同步点,在这个同步点,一对线程可以交换数据.每个线程通过exchange()方法的入口提供数据给他的伙伴线程,并接收 ...

  9. Android 启动、绘制、显示过程

    Activity 启动过程: startActivity()-> Instrumentation.execStartActivity()-> Binder->ActivityMana ...

  10. Scala语言开发入门

    在本系列的第一篇文章 <使用递归的方式去思考>中,作者并没有首先介绍 Scala 的语法,这样做有两个原因:一是由于过多的陷入语法的细节其中,会分散读者的注意力.反而忽略了对于基本概念,基 ...