百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

PHP 正则表达式perl函数(php正则匹配a标签href)

toyiye 2024-08-26 22:40 5 浏览 0 评论

preg_match() 执行一个正则表达式匹配

该函数只作一次匹配,最终返回0或1的匹配结果数

int preg_match ( string $pattern , string $subject [, array &$matches ] )

<?php
$pattern='/(https?|ftps?|http?):\/\/(www)\.([^\.\/]+)\.(com|net|org)(\/[\w-\.\/\?\%\&\=]*)?/i'; //正则表达式
$subject="网址为http://www.xxxxxx.com/index.php网站搜索"; //被搜索字符串

if(preg_match($pattern, $subject, $matches)) { //使用preg_match()函数进行匹配
    echo "搜索到的URL为:".$matches[0]."<br>"; //数组中第一个元素保存全部匹配结果
    echo "URL中的协议为:".$matches[1]."<br>"; //数组中第二个元素保存第一个子表达式
    echo "URL中的主机为:".$matches[2]."<br>"; //数组中第三个元素保存第二个子表达式
    echo "URL中的域名为:".$matches[3]."<br>"; //数组中第四个元素保存第三个子表达式
    echo "URL中的顶域为:".$matches[4]."<br>"; //数组中第五个元素保存第四个子表达式
    echo "URL中的文件为:".$matches[5]."<br>"; //数组中第六个元素保存第五 个子表达式
} else {
    echo "搜索失败!"; //如果和正则表达式没有匹配成功则输出此条语句
}
?>

preg_match_all() 执行一个全局正则表达式匹配, 返回完整匹配次数(可能是0), 或者如果发生错误返回FALSE。

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

PREG_PATTERN_ORDER 为默认值, 结果排序为$matches[0]保存完整模式的所有匹配, $matches[1] 保存第一个子组的所有匹配, 以此类推。

PREG_SET_ORDER 结果排序为$matches[0]包含第一次匹配得到的所有匹配(包含子组), $matches[1]是包含第二次匹配到的

所有匹配(包含子组)的数组, 以此类推。

<?php
$pattern='/(https?|ftps?):\/\/(www|mail)\.([^\.\/]+)\.(com|net|org)(\/[\w-\.\/\?\%\&\=]*)?/i';
//声明一个包含多个URL链接地址的多行文字
$subject="网址为http://mail.xxxxxx.net/index.php电子邮箱,
网址为http://www.baidu.com/index.php搜索文件,
网址为http://www.google.com/index.php搜索文件。";
$i=1; //定义一个计数器,用来统计搜索到的结果数
if(preg_match_all($pattern, $subject, $matches, PREG_SET_ORDER)) { //搜索全部的结果
    foreach($matches as $urls) //循环遍历二维数组$matches
    {
        echo "搜索到第".$i."个URL为:".$urls[0]."<br>";
        echo "第".$i."个URL中的协议为:".$urls[1]."<br>";
        echo "第".$i."个URL中的主机为:".$urls[2]."<br>";
        echo "第".$i."个URL中的域名为:".$urls[3]."<br>";
        echo "第".$i."个URL中的顶域为:".$urls[4]."<br>";
        echo "第".$i."个URL中的文件为:".$urls[5]."<br>";
        $i++; //计数器累加
    }
} else {
    echo "搜索失败!";
}
?>

输出:搜索到第1个URL为:http://mail.xxxxxx.net/index.php

第1个URL中的协议为:http

第1个URL中的主机为:mail

第1个URL中的域名为:xxxxxx

第1个URL中的顶域为:net

第1个URL中的文件为:/index.php

搜索到第2个URL为:http://www.baidu.com/index.php

第2个URL中的协议为:http

第2个URL中的主机为:www

第2个URL中的域名为:baidu

第2个URL中的顶域为:com

第2个URL中的文件为:/index.php

搜索到第3个URL为:http://www.google.com/index.php

第3个URL中的协议为:http

第3个URL中的主机为:www

第3个URL中的域名为:google

第3个URL中的顶域为:com

第3个URL中的文件为:/index.php


preg_grep — 返回匹配模式的数组条目

array preg_grep ( string $pattern , array $input )

如果数组带关联数组则保留键名

如果数组不带键名,则重新赋予键名

<?php
$array=array("Linux RedHat7.0", "Apache2.3.2", "MySQL5.7.31", "PHP5.6.6", "LNMP", "130");
//返回数组中以字母开始和以数字结束,并且没有空格的单元,赋给变量$version
$version=preg_grep("/^[a-zA-Z]+(\d|\.)+$/", $array);
print_r($version); //输出:Array ( [1] => Apache2.3.2 [2] => MySQL5.7.31 [3] => PHP5.6.6 )
?>

preg_replace — 执行一个正则表达式的搜索和替换

注意:"\\1"等同于 "\${1}"的形式;

\${1}不能在单引号模式下使用, '\${1}'则会原样输出${1}

如果是两位数的逆向引用, 则采用"\${12}";

如果是一个数后面还有数子, 则采用"\${1}2",

preg_replace()不能识别两位数字的子模式:"\\12";

使用preg_replace()函数时, 最常见的形式就是可以包含反向引用, 即使用"\\n"的形式依次引用正则表达式的模式单元。每个此种引用将被替换

为与第n个被捕获的括号内的子模式所匹配的文本,n可以从0到99,其中\\0指的是被整个模式所匹配的文本,对左圆括号从左到右计数(从1开始)以取得

子模式的数目。

对替换模式在一个逆向引用后面紧接着一个数字时(即紧接着在一个匹配的模式后面的数字),不能使用熟悉的\\1符号来表示逆向引用。

举例说明\\11,将会使preg_replace()搞不清楚是想要第一个\\1的逆向引用后面跟着一个数字1还是一个\\11的逆向引用。

本例中的解决方法是使用\${1}1,这将会形成一个隔离的$1逆向引用,而另一个1只是单纯的文字。

mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )

第四个参数值默认值为-1, 则所有的匹配项都会被替换

<?php
$pattern="/<[\/\!]* ?[^<>]*?>/is"; //可以匹配所有HTML标记的开始和结束的正则表达式
//声明一个带有多个HTML标记的文本
$text="这个文本中有<b>粗体</b>和<u>带有下划线</u>以及<i>斜体</i>还有<font color='red' size='7'>带有颜色和字体大小</font>的标记";
echo preg_replace($pattern, "", $text); //将所有HTML标记替换为空,即删除所有HTML标记
echo "<br>"; //输出换行
echo preg_replace($pattern, "", $text, 2); //通过第四个参数传入数字2,替换前两个HTML标记
?>

"\\1" 双斜线

<?php
$pattern="/(\d{2})\/(\d{2})\/(\d{4})/"; //日期格式的正则表达式
$text="今年春节放假日期为01/25/2009到02/02/2009共7天。"; //带有两个日期格式的字符串
echo preg_replace($pattern, "\\3-\\1-\\2", $text); //将日期替换为以"-"分隔的格式
echo preg_replace($pattern, "\${3}-\${1}-\${2}",$text); //将"\\1"改为"\${1}"的形式
?>

'\1' 单斜线

<?php
$patterns = array ('/(19|20)(\d{2})-(\d{1,2})-(\d{1,2})/',
'/^\s*{(\w+)}\s*=/');
$replace = array ('\3/\4/\1\2', '$\1 ='); // 在子模式中,定界符"/"不需要去转义
echo preg_replace($patterns, $replace, '{startDate} = 1999-5-27');
?>

输出:$startDate = 5/27/1999

实例: 将HTML标记转换为小写:

<?php
$pattern="/(<\/?)(\w+)([^>]*>)/e"; //可以匹配所有HTML标记的开始和结束的正则表达式
//声明一个带有多个HTML标记的文本
$text="这个文本中有<b>粗体</b>和<u>带有下划线</u>以及<i>斜体</i>还有<font color='red' size='7'>带有颜色和字体大小</font>的标记";
$text1='这个文本中有<b>粗体</b>和<u>带有下划线</u>以及<i>斜体</i>还有<font color="red" size="7">带有颜色和字体大小</font>的标记';
echo preg_replace($pattern, "'\\1'.strtoupper('\\2').'\\3'", $text); //将所有HTML的小写标记替换为大写, 正确的语法
echo "<br />";
echo preg_replace($pattern, "'\1'.strtoupper('\2').'\3'", $text); //与上面的结果是不同的,清除了HTML标签
echo "<br />";
echo preg_replace($pattern, '"\1".strtoupper("\2").stripslashes("\3")', $text); //将所有HTML的小写标记替换为大写, 正确的语法
echo "<br />";
echo preg_replace($pattern, '"\\1".strtoupper("\\2")."\\3"', $text); // 自动添加了反斜线 <FONT color=\'red\' size=\'7\'>
echo "<br />";
echo preg_replace($pattern, "'\\1'.strtoupper('\\2').'\\3'", $text1);// 自动添加了反斜线 <FONT color=\'red\' size=\'7\'>
?>

注意:在双引号包括的单引号内部仍然使用\\1(两个反斜线)去捕获子模式;而在单引号包括的双引号内部可以\1(推荐使用)或\\1去捕获子模式;

所以应该考虑外层的引号决定反斜线的数目

为何要使用stripslashes()函数,因为在替换的过程中<font color='red' size='7'>自动添加转义字符,替换的结果为<FONT color=\'red\' size=\'7\'>

而参数$replacement与参数$subject引号未对应(外层与内层的引号未对应), 所以要用stripslashes()函数清除转义字符

去除含有中文的字符串

<?php
$string = "xxxxxx网www.xxxxxx.com";
$str = preg_replace('/([\x80-\xff]*)/i','',$string); //去掉中文汉字
echo $str;
?>

经过严格测试:GB2312和utf-8均可以使用

去除特定的a链接

<?php
$str = '<a class="autolink" title="第7章 文件基础" href="http://192.168.0.52/mod/resource/view.php?id=391">第7章 文件基础</a>';
echo preg_replace('/<a class="autolink" [^>]*>(.*?)<\/a>/is', "$1", $str);
?>

preg_split() 通过一个正则表达式分隔字符串

array preg_split ( string $pattern , string $subject [, int $limit = -1 [, int $flags = 0 ]] )

pattern:用于搜索的模式, 字符串形式。

subject:输入字符串

第三个参数:limit 如果指定, 将限制分隔得到的子串最多只有limit个, 返回的最后一个 子串将包含所有剩余部分。

limit值为-1, 0或null时都代表"不限制", 作为php的标准, 你可以使用null跳过对flags的设置。

第四个参数:flags 可以是任何下面标记的组合(以位或运算 | 组合):

PREG_SPLIT_NO_EMPTY(1)如果这个标记被设置, preg_split() 将进返回分隔后的非空部分

PREG_SPLIT_DELIM_CAPTURE(0)如果这个标记设置了,用于分隔的模式中的括号表达式内容将被捕获并返回。PREG_SPLIT_DELIM_CAPTURE为默认值(0)

PREG_SPLIT_OFFSET_CAPTURE(4)如果这个标记被设置,对于每一个出现的匹配返回时将会附加字符串偏移量.

注意:这将会改变返回数组中的每一个元素, 使其每个元素成为一个由第0个元素为分隔后的子串,第1个元素为该子串在subject中的偏移量组成的数组。

<?php
//按任意数量的空格和逗号分隔字符串,其中包含" ", \r, \t, \n and \f
$keywords = preg_split ("/[\s,]+/", "hypertext language, programming");
print_r($keywords); //分割后输出Array ( [0] => hypertext [1] => language [2] => programming )

//将字符串分割成字符
$chars = preg_split('//', "lamp", -1, PREG_SPLIT_NO_EMPTY);
print_r($chars); //分割后输出Array ( [0] => l [1] => a [2] => m [3] => p )

//将字符串分割为匹配项及其偏移量
$chars = preg_split('/ /','hypertext language programming', -1, PREG_SPLIT_OFFSET_CAPTURE);
print_r($chars);

/* 分割后输出Array ( [0] => Array ( [0] => hypertext [1] => 0 )
* [1] => Array ( [0] => language [1] => 10 )
* [2] => Array ( [0] => programming [1] => 19 ) ) */
?>

相关推荐

# Python 3 # Python 3字典Dictionary(1)

Python3字典字典是另一种可变容器模型,且可存储任意类型对象。字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中,格式如...

Python第八课:数据类型中的字典及其函数与方法

Python3字典字典是另一种可变容器模型,且可存储任意类型对象。字典的每个键值...

Python中字典详解(python 中字典)

字典是Python中使用键进行索引的重要数据结构。它们是无序的项序列(键值对),这意味着顺序不被保留。键是不可变的。与列表一样,字典的值可以保存异构数据,即整数、浮点、字符串、NaN、布尔值、列表、数...

Python3.9又更新了:dict内置新功能,正式版十月见面

机器之心报道参与:一鸣、JaminPython3.8的热乎劲还没过去,Python就又双叒叕要更新了。近日,3.9版本的第四个alpha版已经开源。从文档中,我们可以看到官方透露的对dic...

Python3 基本数据类型详解(python三种基本数据类型)

文章来源:加米谷大数据Python中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。在Python中,变量就是变量,它没有类型,我们所说的"类型"是变...

一文掌握Python的字典(python字典用法大全)

字典是Python中最强大、最灵活的内置数据结构之一。它们允许存储键值对,从而实现高效的数据检索、操作和组织。本文深入探讨了字典,涵盖了它们的创建、操作和高级用法,以帮助中级Python开发...

超级完整|Python字典详解(python字典的方法或操作)

一、字典概述01字典的格式Python字典是一种可变容器模型,且可存储任意类型对象,如字符串、数字、元组等其他容器模型。字典的每个键值key=>value对用冒号:分割,每个对之间用逗号,...

Python3.9版本新特性:字典合并操作的详细解读

处于测试阶段的Python3.9版本中有一个新特性:我们在使用Python字典时,将能够编写出更可读、更紧凑的代码啦!Python版本你现在使用哪种版本的Python?3.7分?3.5分?还是2.7...

python 自学,字典3(一些例子)(python字典有哪些基本操作)

例子11;如何批量复制字典里的内容2;如何批量修改字典的内容3;如何批量修改字典里某些指定的内容...

Python3.9中的字典合并和更新,几乎影响了所有Python程序员

全文共2837字,预计学习时长9分钟Python3.9正在积极开发,并计划于今年10月发布。2月26日,开发团队发布了alpha4版本。该版本引入了新的合并(|)和更新(|=)运算符,这个新特性几乎...

Python3大字典:《Python3自学速查手册.pdf》限时下载中

最近有人会想了,2022了,想学Python晚不晚,学习python有前途吗?IT行业行业薪资高,发展前景好,是很多求职群里严重的香饽饽,而要进入这个高薪行业,也不是那么轻而易举的,拿信工专业的大学生...

python学习——字典(python字典基本操作)

字典Python的字典数据类型是基于hash散列算法实现的,采用键值对(key:value)的形式,根据key的值计算value的地址,具有非常快的查取和插入速度。但它是无序的,包含的元素个数不限,值...

324页清华教授撰写【Python 3 菜鸟查询手册】火了,小白入门字典

如何入门学习python...

Python3.9中的字典合并和更新,了解一下

全文共2837字,预计学习时长9分钟Python3.9正在积极开发,并计划于今年10月发布。2月26日,开发团队发布了alpha4版本。该版本引入了新的合并(|)和更新(|=)运算符,这个新特性几乎...

python3基础之字典(python中字典的基本操作)

字典和列表一样,也是python内置的一种数据结构。字典的结构如下图:列表用中括号[]把元素包起来,而字典是用大括号{}把元素包起来,只不过字典的每一个元素都包含键和值两部分。键和值是一一对应的...

取消回复欢迎 发表评论:

请填写验证码