首页 > 技术文章 > 【PHP基础】正则表达式

php99 2018-09-28 10:17 原文

1.正则表达式的语法
正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串

注意:
1. *、+和?限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个?就可以实现非贪婪或最小匹配。
2.(...) 括号内的正则表达式表示表示选中的部分。
3.PHP匹配模式的字符串前后都要加上  / 作为界定符 ,也可以用#  ~ 等,只要不是字母或者反斜杠并且前后成对出现即可 。
 
2.正则表达式
 
2.1、单次正则表达式的匹配

2.1.1.preg_match() :第一次匹配字符成功就返回(数组)

<?php 
//需要匹配的字符串。date函数返回当前时间 $content = "Current date and time is ".date("Y-m-d h:i a").", we are learning PHP together."; 
//使用通常的方法匹配时间 if (preg_match ("/\d{4}-\d{2}-\d{2} \d{2}:\d{2} [ap]m/", $content, $m)) 
{ 
echo "匹配的时间是:" .$m[0]. "\n"; 
} 
//由于时间的模式明显,也可以简单的匹配 if (preg_match ("/([\d-]{10}) ([\d:]{5} [ap]m)/", $content, $m)) 
{ 
echo "当前日期是:" .$m[1]. "\n"; 
echo "当前时间是:" .$m[2]. "\n"; 
} 
?>

这是一个简单动态文本串匹配实例。假设当前系统时间是“2006年8月17日13点25分”,将输出如下的内容。 
匹配的时间是:2006-08-17 01:25 pm 
当前日期是:2006-08-17 
当前时间是:01:25 pm

2.1.2.preg_grep() :第一次匹配数组成功就返回(数组)

<?php 
$subjects = array( 
"Mechanical Engineering", "Medicine", 
"Social Science", "Agriculture", 
"Commercial Science", "Politics" 
); 
//匹配所有仅由有一个单词组成的科目名 
$alonewords = preg_grep("/^[a-z]*$/i", $subjects); 
?>
 
2.2、进行全局正则表达式匹配 
2.2.1.preg_match_all() :匹配完全文所有的字符才返回
<?php 
//功能:将文本中的链接地址转成HTML 
//输入:字符串 
//输出:字符串 function url2html($text) 
{ 
//匹配一个URL,直到出现空白为止 preg_match_all("/http:\/\/?[^\s]+/i", $text, $links); 
//设置页面显示URL地址的长度 $max_size = 40; 
foreach($links[0] as $link_url) 
{ 
//计算URL的长度。如果超过$max_size的设置,则缩短。 $len = strlen($link_url); 
if($len > $max_size) 
{ 
$link_text = substr($link_url, 0, $max_size)."..."; 
} else { 
$link_text = $link_url; 
} 
//生成HTML文字 $text = str_replace($link_url,"<a href='$link_url'>$link_text</a>",$text); 
} 
return $text; 
} 
//运行实例 $str = “这是一个包含多个URL链接地址的多行文字。欢迎访问http://www.jb51.net”; print url2html($str); 
/*输出结果 
这是一个包含多个URL链接地址的多行文字。欢迎访问<a href='http://www.jb51.net'> 
http://www.jb51.net</a> 
*/ 
?> 

 

2.3、正则表达式的替换 
2.3.1.preg_replace() 

函数原型:mixed preg_replace (mixed $pattern, mixed $replacement, mixed $subject [, int $limit]) 
preg_replace较ereg_replace的功能更加强大。其前三个参数均可以使用数组;第四个参数$limit可以设置替换的次数,默认为全部替换。代码6.7是一个数组替换的应用实例。 
数组替换 代码如下:

<?php 
//字符串 $string = "Name: {Name}<br>\nEmail: {Email}<br>\nAddress: {Address}<br>\n"; 
//模式 $patterns =array( 
"/{Address}/", 
"/{Name}/", 
"/{Email}/" 
); 
//替换字串 $replacements = array ( 
"No.5, Wilson St., New York, U.S.A", 
"Thomas Ching", 
"tom@emailaddress.com", 
); 
//输出模式替换结果 print preg_replace($patterns, $replacements, $string); 
?>  

输出结果如下。 
Name: Thomas Ching", 
Email: tom@emailaddress.com 
Address: No.5, Wilson St., New York, U.S.A 

 

2.4、正则表达式的拆分 

2.4.1.split()
函数原型:array split (string $pattern, string $string [, int $limit]) 
本函数返回一个字符串数组,每个单元为$string经正则表达式$pattern作为边界分割出的子串。如 果设定了$limit,则返回的数组最多包含$limit个单元。而其中最后一个单元包含了$string中剩余的所有部分。spliti是split的 忽略大小版本。代码6.8是一个经常用到关于日期的示例。 
日期的拆分 代码如下:
<?php 
$date = "08/30/2006"; 
//分隔符可以是斜线,点,或横线 list($month, $day, $year) = split ('[/.-]', $date); 
//输出为另一种时间格式 echo "Month: $month; Day: $day; Year: $year<br />\n"; 
?> 

提示 使用正则表达式的方法分割字符串,可以使用更广泛的分隔字符。例如,上面 对日期格式和单词处理的分析。如果仅用某个特定的字符进行分割,建议使用explode()函数,它不调用正则表达式引擎,因此速度是最快的。

 

推荐阅读