php利用preg_match_all()正则获取字符串中指定参数链接地址

 更新时间:2016年11月25日 17:42  点击:1667
php利用preg_match_all()正则获取字符串中指定参数链接地址很简单的,我们只要配合正则规则就可以实现了我们想要的结果了,下面看一个例子,非常的简单。

程序代码

<?php
 $html = <<<HTML
  <a href="http://www.111cn.net /?source=2008hao123banner">a1</a>
  <a href="http://www.111cn.net /?source=2009hao123banner">a2</a>
HTML;

 // echo $html;

$m = array();
preg_match_all("|<a href=\"http://www.111cn.net /\?source=(\d+)hao123banner\">(.*?)</a>|",$html,$m);

print_r($m);

运行结果

Array
(
    [0] => Array
        (
            [0] => <a href="http://www.111cn.net /?source=2008hao123banner">a1</a>
            [1] => <a href="http://www.111cn.net /?source=2009hao123banner">a2</a>
        )

    [1] => Array
        (
            [0] => 2008
            [1] => 2009
        )

    [2] => Array
        (
            [0] => a1
            [1] => a2
        )

)

对于很多同学和我一样觉得匹配所有字符串我们可能使用.*来获取了,但是测试发现如果在一行没有问题,如果有换行就不行了,那么要如何处理。

对正则我是一知半解,我对正则的理念就是,能用就行!

对于所有字符,我一开始的理解就是 .*

后来GOOGLE了一下,才知道.*连在一起就意味着任意数量的不包含换行的字符。

所以可以使用 [\s\S]* 它的意思是任意空白字符和非空白字符。同理,也可以用 “[\d\D]*”、“[\w\W]*” 来表示。 d和D,w和W,s和S都是反义,加起来就是全部字符了。

注意:写在文本中的n是不会自动视为换行符的,测试$_="asdfnasdf";s/./-/;print;即可明白


补充

匹配中文字符的正则表达式: [\u4e00-\u9fa5]
匹配双字节字符(包括汉字在内):[^\x00-\xff]
匹配空行的正则表达式:\n[\s| ]*\r
匹配HTML标记的正则表达式:/<(.*)>.*<\/\1>|<(.*) \/>/
匹配首尾空格的正则表达式:(^\s*)|(\s*$)

正则提取页面指定内容非常的简单我们可以通过preg_match执行正则表达式来实现了,下面整理了一些例子,希望对各位朋友会带来帮助哦。

例子代码如下,可常用于采集哦、

 代码如下 复制代码


1、获取页面标题

//提取标题
            preg_match('/<title>(?<title>.*?)<\/title>/i', $html, $titleArr);
            $title = $titleArr['title'];
2、获取body主体内容,并将背景图片提取出来替换成其他图片地址

/**
 * 获取BODY主体区域内容
 * @param $html
 * @param $urlRoot
 * @return mixed
 */
function getBody($html,$urlRoot = null){
    //提取BODY主体
    preg_match('/<!--body-->(.*?)<!--body-->/is ', $html, $bodyArr);
    if(!$bodyArr){
        preg_match('/<body.*?>(.*?)<\/body>/is ', $html, $bodyArr);
    }
    $body = $bodyArr[1];
    //替换img文件
    $body =  preg_replace('/(<[img|IMG].*src=[\'|"])(\.\.\/)*(img.[^\'||^"]+)/',"$1$urlRoot$3",$body);
    //替换html文件内的css背景图片
    $body =  preg_replace('~\b(background(-image)?\s*:(.*?)\(\s*[\'|"]?)(\.\.\/)*(img.*?)?\s*\)~i',"$1$urlRoot$5)",$body);
    return $body;
}
3、提取页面Description内容

function getDescription($html){
    // Get the 'content' attribute value in a <meta name="description" ... />
    $matches = array();
 
    // Search for <meta name="description" content="Buy my stuff" />
    preg_match('/<meta.*?name=("|\')description("|\').*?content=("|\')(.*?)("|\')/i', $html, $matches);
    if (count($matches) > 4) {
        return trim($matches[4]);
    }
 
    // Order of attributes could be swapped around: <meta content="Buy my stuff" name="description" />
    preg_match('/<meta.*?content=("|\')(.*?)("|\').*?name=("|\')description("|\')/i', $html, $matches);
    if (count($matches) > 2) {
        return trim($matches[2]);
    }
 
    // No match
    return null;
}
4、替换css文件的背景图片地址

/**
 * 获取CSS内容
 * @param $cssCnt
 * @param $urlRoot
 * @return mixed
 */
function getCss($cssCnt,$urlRoot =null){
    //匹配包含 img文件夹的相对路径图片 (含义绝对路径的不包含在其中)
    //匹配替换不一定准确,因为只是将 含义 ../ 的地址转为url 而没有考虑 ../../ 之类的层级关系
    $css =  preg_replace('~\b(background(-image)?\s*:(.*?)\(\s*[\'|"]?)(\.\.\/)*(img.*?)?\s*\)~i',"$1$urlRoot$5)",$cssCnt);
    //添加css前缀
    $css =  preg_replace('/\b.(.*?)[,|{]/',"pat .$0",$cssCnt);
    //TODO 压缩css
    return $css;
}


 

从上面例子来看其实都是非常的简单就是批有规律的标签为开始与结束节点,这样我们可以获取这两个字符之类的内容也就是我们要提取的内容了哦,只是在中间有字符或空格的一些处理了哦。

正则表达式是一篇艺术了,下面我来给各位朋友详细总结了在我们开发应用中正则表达式的一些例子,包括了常用的函数与常用的例子。

正则语法规则

    我们先介绍三个东西,然后可以进行简单的例子了。
一、定界符    "/" 左斜线
php采用左斜线作为定界符,规定规则的边界,成对出现,两个定界符之间的内容就是需要被匹配的规则

二、元字符---出现模式类

匹配方式,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。
比如出现一次,出现多于一次,出现多次,没有出现。等等。
常用的有:
    +     1次或多次
    *     0次或1次或多次
    ?    0次或1次
  {2,6}   2-6次
   {2}    恰巧2次
   {3,}   至少3次,>=3

三、元字符---特定字符类

代表一个特定的字符
\s     空白字符(单个空格符、tab键和换行符)
\S     非空白字符
\d     数字(单个 0到9)
\w     字母,数字或下划线字符
\W     非(字母,数字或下划线字符)
 .     除换行符之外的所有字符


1. preg_match()函数

函数原型:int preg_match (string $pattern, string $content [, array $matches])
preg_match ()函数在$content字符串中搜索与$pattern给出的正则表达式相匹配的内容。如果提供了$matches,则将匹配结果放入其 中。$matches[0]将包含与整个模式匹配的文本,$matches[1]将包含第一个捕获的与括号中的模式单元所匹配的内容,以此类推。该函数只 作一次匹配,最终返回0或1的匹配结果数。代码6.1给出

preg_match()函数在字符串中搜索模式,如果存在则返回true,否则返回false

 代码如下 复制代码

$pattern='/php/';
$str='111cn.net';
echo preg_match($pattern,$str);

输出结果:1

2. preg_grep()函数

preg_grep()函数搜索数组中的所有元素,返回由与某个模式匹配的所有元素组成的数组

 代码如下 复制代码

$pattern='/p$/';
$strArray=array('asp','php','jsp','python','ruby');
print_r(preg_grep($pattern,$strArray));

输出结果:
 Array
(
 [0] => asp
 [1] => php
 [2] => jsp
)

3. preg_match_all()函数

preg_match_all()函数在字符串中匹配模式的所有出现,然后将所有匹配到的全部放入数组

 代码如下 复制代码

<?php
 
//preg_match("正则表达式","字符串")用于在字符串中查找匹配项
 
$email = "987044391@qq.com";
if (preg_match("/^([a-zA-Z0-9])+([.a-zA-Z0-9_-])*@([.a-zA-Z0-9_-])+([.a-zA-Z0-9_-]+)+([.a-zA-Z0-9_-])$/",$email)){
 echo '匹配成功<hr />';
}else {
 echo '匹配失败<hr />';
}
 
//preg_quote("字符串") 在每个有正则表达式语法前面加入一个转义字符即\
 
$str = "php点点通是一个学习php的网站,(⊙o⊙)…";
echo preg_quote($str);
echo "<hr />";
 
//preg_split("正则","字符串")分割字符串
$php = "+php++点点通++++是好网站";
$field = preg_split("/\+{1,}/",$php);
foreach($field as $f){
 echo $f." ";
}
echo "<hr />";
//preg_grep("正则","字符串") 与数组匹配后返回新数组
$phpddt = array("php点点通","php100","呵呵","hahaha","phpchina");
$item = preg_grep("/^php/",$phpddt);
print_r($item);
 
echo "<hr />";
//preg_replace("正则","替换内容","原字符串")    很重要,很常用
$a = "欢迎光临http://www.111cn.net/";  //给http开头的加上超链接
echo preg_replace("/http:\/\/(.*)\//","<a href=\"\${0}\">\${0}</a>","$a");
 
?>

4. preg_quote()函数

preg_quote()函数在每个对于正则表达式语法而言有特殊含义的字符前插入一个反斜线。

echo preg_quote('苹果的价格是:$5/千克');

输出结果:苹果的价格是:\$5/千克

5. preg_replace()函数

preg_replace()函数搜索到所有的匹配,然后替换成想要的字符串返回

 代码如下 复制代码

$pattern='/php[1-5]/';
$str='php1php2php3php4php5php6php7php8';

echo preg_replace($pattern,'PHP',$str);

输出结果:PHPPHPPHPPHPPHPphp6php7php8

6. preg_split()函数

preg_split()函数以不区分大小写的方式分割字符串,将所得到的字串组成数组并返回

 代码如下 复制代码

$pattern='/[\.@]/';
$str='feng.yingyuan@sina.com.cn';

print_r(preg_split($pattern,$str));

输出结果:
Array
(
 [0] => feng
 [1] => yingyuan
 [2] => sina
 [3] => com
 [4] => cn
)


 

ereg()和eregi()

ereg()是POSIX扩展库中正则表达式的匹配函数。eregi()是ereg()函数的忽略大小写的版 本。二者与preg_match的功能类似,但函数返回的是一个布尔值,表明匹配成功与否。需要说明的是,POSIX扩展库函数的第一个参数接受的是正则 表达式字符串,即不需要使用分界符。例如,代码6.2是一个关于文件名安全检验的方法。
代码6.2 文件名的安全检验

 代码如下 复制代码

<?php
$username = $_SERVER['REMOTE_USER'];
$filename = $_GET['file'];
//对文件名进行过滤,以保证系统安全
if (!ereg('^[^./][^/]*$', $userfile))
{
die('这不是一个非法的文件名!');
}
//对用户名进行过滤
if (!ereg('^[^./][^/]*$', $username))
{
die('这不是一个无效的用户名');
}
//通过安全过滤,拼合文件路径
$thefile = "/home/$username/$filename";
?>

通常情况下,使用与Perl兼容的正则表达式匹配函数perg_match(),将比使用ereg()或eregi()的速度更快。如果只是查找一个字符串中是否包含某个子字符串,建议使用strstr()或strpos()函数

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);
?>

今天在一个群里看到一个站长在问如何把一段字符串中指定两个字符串这间的内容提取出来,这个我是想用于做文章分页标签了,但后来测试多个标题此方法暂时不行,单个撮是没有问题的。

例子,

 代码如下 复制代码
<?php
$fcontents ="fdsafdafdsa{page}中国要呀{/page}dafdsafdsafdsafdsa";
if(eregi("{page}(.*){/page}", $fcontents,$regs)){
 //echo "成功";
//print_r($regs);
 echo $regs[1];
}
else{
 echo "失败";
}
exit;
?>

输出结果

中国要呀

那么我们如果测试放多个标签会怎么样呢

 代码如下 复制代码

<?php

$fcontents ="fdsafdafdsa{page}中国要呀{/page}dafdsafdsafdsafdsa{page}你好中国{/page}fdsafdsafsda{page}我爱中国{/page}fdafdsa";
if(eregi("{page}(.*){/page}", $fcontents,$regs)){
 //echo "成功";
//print_r($regs);
 echo $regs[1];
}
else{
 echo "失败";
}


exit;
?>

输出结果

中国要呀{/page}dafdsafdsafdsafdsa{page}你好中国{/page}fdsafdsafsda{page}我爱中国

发现这个闭合会有问题了,暂时还没想到办法。

[!--infotagslink--]

相关文章

  • C#中截取字符串的的基本方法详解

    这篇文章主要介绍了C#中截取字符串的的基本方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-03
  • c#中判断字符串是不是数字或字母的方法

    这篇文章介绍了C#判断字符串是否数字或字母的实例,有需要的朋友可以参考一下...2020-06-25
  • PostgreSQL判断字符串是否包含目标字符串的多种方法

    这篇文章主要介绍了PostgreSQL判断字符串是否包含目标字符串的多种方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-02-23
  • 详解C++ string常用截取字符串方法

    这篇文章主要介绍了C++ string常用截取字符串方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
  • php字符串按照单词逐个进行反转的方法

    本文实例讲述了php字符串按照单词进行反转的方法。分享给大家供大家参考。具体分析如下:下面的php代码可以将字符串按照单词进行反转输出,实际上是现将字符串按照空格分隔到数组,然后对数组进行反转输出。...2015-03-15
  • 使用list stream: 任意对象List拼接字符串

    这篇文章主要介绍了使用list stream:任意对象List拼接字符串操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-09
  • MySQL 字符串拆分操作(含分隔符的字符串截取)

    这篇文章主要介绍了MySQL 字符串拆分操作(含分隔符的字符串截取),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-22
  • C# 16 进制字符串转 int的方法

    这篇文章主要介绍了C# 16 进制字符串转 int的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • 获取中文字符串的实际长度代码

    JS中默认中文字符长度和其它字符长度计算方法是一样的,但某些情况下我们需要获取中文字符串的实际长度,代码如下: 复制代码 代码如下: function strLength(str) { var realLength = 0, len = str.length, charCode = -1;...2014-06-07
  • 一个关于JS正则匹配的踩坑记录

    这篇文章主要给大家介绍了一个关于JS正则匹配的踩坑记录,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-04-13
  • C#实现字符串转换成字节数组的简单实现方法

    这篇文章主要介绍了C#实现字符串转换成字节数组的简单实现方法,仅一行代码即可搞定,非常简单实用,需要的朋友可以参考下...2020-06-25
  • PostgreSQL 字符串处理与日期处理操作

    这篇文章主要介绍了PostgreSQL 字符串处理与日期处理操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-01
  • php 中英文混合字符串截取

    文章介绍一个实用的函数,我们如果用php substr来截取字符在中文上处理的很有问题,今天自己写了一个比较好的中文与英文字符截取的函数,有需要的朋友可以参考下。 ...2016-11-25
  • C#实现对字符串进行大小写切换的方法

    这篇文章主要介绍了C#实现对字符串进行大小写切换的方法,涉及C#操作字符串的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • c#将字节数组转成易读的字符串的实现

    这篇文章主要介绍了c#将字节数组转成易读的字符串的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
  • C#获取字符串后几位数的方法

    这篇文章主要介绍了C#获取字符串后几位数的方法,实例分析了C#操作字符串的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • 解决vue字符串换行问题(绝对管用)

    这篇文章主要介绍了解决vue字符串换行问题(绝对管用),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-06
  • C#判断一个字符串是否是数字或者含有某个数字的方法

    这篇文章主要介绍了C#判断一个字符串是否是数字或者含有某个数字的方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • 【C#基础】Substring截取字符串的方法小结(推荐)

    这篇文章主要介绍了Substring截取字符串方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
  • 使用PHP similar text计算两个字符串相似度

    在网站开发中,我们经常使用php similar text 计算两个字符串相似度;1,similar_text的用法 如果我想计算"ly89cn"和"ly89"的相似程度,有两种表示方法复制代码 代码如下: echo similar_text('ly89cn', 'ly89'); ...2015-11-08