PHP正则表达式提取html超链接中的href地址

 更新时间:2016年11月25日 17:28  点击:1688
有时我们需要过滤或提取html字符串的外链接了,下面我介绍一个利用PHP正则表达式提取html超链接中的href地址程序,各位机参考。

用php的正则表达式相关函数,实现提取html超链接<a href="地址"></a>中的地址。

 代码如下 复制代码

<?php

$preg='/<a .*?href="(.*?)".*?>/is';

$str ='<a href="链接1">URLNAME</a>文本段1<a href="链接2" target="_blank">URLNAME</a>文本段2<a  target="_blank" href="链接3">URLNAME</a>...文本段n';

preg_match_all($preg,$str,$match);//在$str中搜索匹配所有符合$preg加入$match中

for($i=0;$i<count($match[1]);$i++)//逐个输出超链接地址

{

  echo $match[1][$i]."<br />";

}

?>

 

最终输出:

链接1<br />链接2<br />链接3<br />


附一个
PHP的正则表达式提取图片地址的代码。

 代码如下 复制代码

$str='<p style="padding: 0px; margin-top: 0px; margin-bottom: 0px; line-height: 200%;"><img border="0" src="upfiles/2009/07/1246430143_4.jpg" alt=""/></p><p style="padding: 0px; margin-top: 0px; margin-bottom: 0px; line-height: 200%;"><img border="0" src="upfiles/2009/07/1246430143_3.jpg" alt=""/></p><p style="padding: 0px; margin-top: 0px; margin-bottom: 0px; line-height: 200%;"><img border="0" src="upfiles/2009/07/1246430143_1.jpg" alt=""/></p>'; 

$pattern="/<[img|IMG].*?src=['|"](.*?(?:[.gif|.jpg]))['|"].*?[/]?>/"; 

preg_match_all($pattern,$str,$match); 

print_r($match);

在php中赋值为变量赋值与引用赋值了,下面我来给各位同学介绍他们的一些基本用法与区别了。

1、值赋值:将赋值表达式的值复制到变量。例子:

 代码如下 复制代码

$number=15;
$age=20;
$sum=12+"15";//$sum=27


2.创建数组有变量赋值和调用函数两种方法,这里先讲前者。

使用变量赋值方法很简单,直接给一个数组变量赋值即可。

实例:

 代码如下 复制代码

 <?php
 $lang[]="php";
 $lang[]="html";
 $lang[]="css";
 echo "$lang[0] <br>";
 echo "$lang[1] <br>";
 echo "$lang[2] <br>";
?>

三个赋值语句产生的数组内容:

0=>php

1=>html

2=>css

3、引用赋值:所创建的变量与另一个变量引用的内容相同。因此如果多个变量引用了同一内容,修改其中任一个变量,在其余的变量上都会有反映。在等号后面加一个&符号($val2=& $val1)就可以完成引用赋值或者将&符号放在引用的变量前面($val2= &$val1):

 代码如下 复制代码

$val1="hello";
$val2=& $val1;
$val2="goodby";
echo '$val1 is '.$val1."
";
echo '$val2 is '.$val2."
";
?>

$val1 is goodby
$val2 is goodby


foreach引用赋值的问题

代码:

 代码如下 复制代码

<?php

$a = array(
    'a' => 'aa',
    'b' => 'bb',
    'c' => 'cc',
);
foreach( $a  as &$v){
;
}
print_r($a);


foreach( $a  as $v){

}

print_r($a);


----------------------

仔细想想,其实是简单的引用问题,第一次foreach完毕,$v实际是$a['c']的引用,循环时,每次对$v的赋值都会会改变$a['c']的值,而最后一次对$v的赋值是$v=$a['c'],$a['c']在上一次被赋值为$a['b'],所以会会出现上述情况

header()函数在php的使用很大,下面我来介绍利用它实现页面缓存的一些方法,但使用header前必须注意,在它之前不能任何输出,包括空格。

手册上,我们对于cache都是写着如何设置,以便让代码不被cache:

 代码如下 复制代码

header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0"); // HTTP/1.1
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
header("Pragma: no-cache"); // Date in the past


而且在设置的时候还得注意在header前不能有输出,否则header设置无效,但都没有写过,如何给页面设置Cache,虽然我们知道有一些办法,比如 E-TAG之类的。当然也有简单的设置:

比如我们在输出前,对内容进行md5,将它当成e-tag只要没变化,就不会有影响。也有其他的方式:

 代码如下 复制代码

$seconds_to_cache = 3600;
$ts = gmdate("D, d M Y H:i:s", time() + $seconds_to_cache) . " GMT";
header("Expires: $ts"); header("Pragma: cache");
header("Cache-Control: max-age=$seconds_to_cache");


缓存1小时,主要是过期时间得用gmdate来设置,而不是date,这个要注意,其他都差不多。maxage要和expire能够对得上。

对于PHP产生的动态内容,只需要在内容输出之前输出强制缓存的header即可,比如下面的代码即要求浏览器缓存文件1个月:

 代码如下 复制代码

<?php
  header("Cache-Control: public");
  header("Pragma: cache");

  $offset = 30*60*60*24; // cache 1 month
  $ExpStr = "Expires: ".gmdate("D, d M Y H:i:s", time() + $offset)." GMT";
  header($ExpStr);
?>

对于静态文件,一般的服务器都支持第3级缓存状态。要想达到第四级的缓存效果,要么像之前GZIP压缩那样,用PHP外包一层,然后用PHP处理。要么需要服务器端的支持,APACHE的一个模块mod_expires支持给文件添加expires header。把下面的代码加入你的blog目录下的.htaccess文件,如果你的服务器安装了mod_expires模块,则将自动生效,图片等强制缓存一个月,html文档缓存10分钟。如果该模块没有安装,也不会出错。

 代码如下 复制代码

<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/gif A2592000
ExpiresByType image/jpeg A2592000
ExpiresByType image/png A2592000
ExpiresByType application/x-shockwave-flash A2592000
ExpiresByType text/css A2592000
ExpiresByType application/x-javascript A2592000
ExpiresByType text/html A600
</IfModule>


在这里有mod_expires更详细的文档和教程。不过我要说明的是,mod_expires在绝大多数服务器上都没安装

在php中要记录页面中代码执行时间我们只使用microtime函数生成时间,然后在最后把开始与结束时间相减即可解决了。

核心代码

 代码如下 复制代码

$t1 = microtime(true);
// ... 执行代码 ...
$t2 = microtime(true);
echo '耗时'.round($t2-$t1,3).'秒';

上面为核心代码下面我们详细的来介绍一下

 代码如下 复制代码


<?php
$start_time=microtime(true); //获取程序开始执行的时间
 echo "hello world!<br />"; //你执行的代码
 $end_time=microtime(true);//获取程序执行结束的时间
 $total=$end_time-$start_time; //计算差值
 echo "此php文件中代码执行了{$total}秒";
?>

在php中数组排序函数有很多很多(rsort,sort,asort,rsort,krsort,ksort,array_multisort),下面我来给各位朋友总结我们常用到的一些数组排序函数与用户自己写的数组排序实例,有需要使用的朋友可参考。

数组排序最常用的函数就是 sort($arr); 它的作用是按数组的键值升序排列,并且排序后的数组键名不再是原来的键名,是按新数组来重新设置的键名。
而有时我们要求更复杂的排序。如按键名排序,这里用到 ksort($arr); 函数,它会根据数组的键名排序,并维持原有的键值关系。相对应的 asort($arr); 函数,是按键值排序,且维持原有的键值关系。

同样原理,rsort(); arsort(); krsort(); 函数除了排序是按降序排列外,其它与sort(); rsort(); ksort(); 相同。
数组操作是PHP很重要的基础,希望能好好运用。


按键值排序
即按标识符ASCⅡ码值的大小排列顺序。

ksort(): 按照数组标识符顺序排列
krsort(): 按照数组标识符逆序排
实例1:

 代码如下 复制代码

<?php
 $languages=array(
  'c'=>'php',
  'd'=>'asp',
  'a'=>'jsp',
  'b'=>'java'
 );
 krsort($languages);
 foreach($languages as $key=>$val){
  echo "$key = $val".'<br>';
 };
?>

按元素值排序

asort(): 按照由小到大的顺序对数组排序;
rsort(): 按照由大到小的顺序对数组逆序排序。
 
将实例1的8-11行代码改为:

 代码如下 复制代码

asort($languages);
print_r($languages);
echo "<br>";
rsort($languages);
print_r($languages);


删除原有键名排序

sort(): 按照由小到大的顺序对数组排序;
rsort(): 按照由大到小的顺序对数组逆序排序。

将实例2的8-11行代码改为:

 代码如下 复制代码

sort($languages);
foreach($languages as $key=>$val){
 echo "languages[$key] = $val".'<br>';
};

array_multisort -- 对多个数组或多维数组进行排序
说明
bool array_multisort ( array ar1 [, mixed arg [, mixed ... [, array ...]]] )

例子 1. 对多个数组排序

 代码如下 复制代码

<?php
$ar1 = array("10", 100, 100, "a");
$ar2 = array(1, 3, "2", 1);
array_multisort($ar1, $ar2);

var_dump($ar1);
var_dump($ar2);
?>

本例中经过排序后,第一个数组将包含 "10","a",100,100。第二个数组将包含 1,1,"2",3。第二个数组中的项目顺序完全和第一个数组中相应的项目(100 和 100)顺序一致。

 代码如下 复制代码

array(4) {
[0]=> string(2) "10"
[1]=> string(1) "a"
[2]=> int(100)
[3]=> int(100)
}
array(4) {
[0]=> int(1)
[1]=> int(1)
[2]=> string(1) "2"
[3]=> int(3)
}

 

例子 2. 对多维数组排序

 代码如下 复制代码

<?php
$ar = array (array ("10", 100, 100, "a"), array (1, 3, "2", 1));
array_multisort ($ar[0], SORT_ASC, SORT_STRING,
                 $ar[1], SORT_NUMERIC, SORT_DESC);
?>

 

本例中经过排序后,第一个数组将包含 10,100,100,"a"(作为字符串上升排序),第二个数组将包含 1,3,"2",1(作为数值下降排序)。


PHP数组排序函数很多,也很强大
如:arsort,asort,krsort,ksort,sort…
但有时候还是满足不了我们的需求
假如有一个二维数组,我们要按二维数组中的一个值来排序
就需要用到了usort自定义数组排序


例子如下:

 代码如下 复制代码

 
<?php
 
$aa = array (array ("score"=>60),
    array ("score"=>70),
    array ("score"=>80),
    array ("score"=>90),
    array ("score"=>20),
    array ("score"=>10),
    array ("score"=>50),
    array ("score"=>30));
 
echo '------排序前输出------<br />';   
var_dump($aa); // 排序前输出
 
usort($aa, "cmp"); // 排序处理(从大到小)
 
echo '<br />------排序后输出------<br />';
var_dump($aa); // 排序完输出
 
/**
 * 自定义排序条件
 * @param array $a
 * @param array $b
 * @return bool
 */
function cmp($a, $b) {
 if ($a["score"] == $b["score"]) {
  return 0;
 }
 return ($a["score"] < $b["score"]) ? 1 : -1;
}
 
?>

输出结果:

 代码如下 复制代码

------排序前输出------
array(8) { [0]=> array(1) { ["score"]=> int(60) }
 [1]=> array(1) { ["score"]=> int(70) }
 [2]=> array(1) { ["score"]=> int(80) }
 [3]=> array(1) { ["score"]=> int(90) }
 [4]=> array(1) { ["score"]=> int(20) }
 [5]=> array(1) { ["score"]=> int(10) }
 [6]=> array(1) { ["score"]=> int(50) }
 [7]=> array(1) { ["score"]=> int(30) } }
------排序后输出------
array(8) { [0]=> array(1) { ["score"]=> int(90) }
 [1]=> array(1) { ["score"]=> int(80) }
 [2]=> array(1) { ["score"]=> int(70) }
 [3]=> array(1) { ["score"]=> int(60) }
 [4]=> array(1) { ["score"]=> int(50) }
 [5]=> array(1) { ["score"]=> int(30) }
 [6]=> array(1) { ["score"]=> int(20) }
 [7]=> array(1) { ["score"]=> int(10) } }

[!--infotagslink--]

相关文章

  • PHP正则表达式取双引号内的内容

    取双引号内的内容我们如果一个字符串中只有一个可以使用explode来获得,但如果有多个需要使用正则表达式来提取了,具体的例子如下。 写程序的时候总结一点经验,如何只...2016-11-25
  • PHP正则表达式之捕获组与非捕获组

    今天遇到一个正则匹配的问题,忽然翻到有捕获组的概念,手册上也是一略而过,百度时无意翻到C#和Java中有对正则捕获组的特殊用法,搜索关键词有PHP时竟然没有相关内容,自己试了一下,发现在PHP中也是可行的,于是总结一下,分享的同...2015-11-08
  • 一个关于JS正则匹配的踩坑记录

    这篇文章主要给大家介绍了一个关于JS正则匹配的踩坑记录,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-04-13
  • php 验证只能输入汉字、英语、数字的正则表达式

    正则表达式是一门非常有用的并且进行模糊判断的一个功能了,我们下面来看通过正则来验证输入汉字、英语、数字,具体如下。 收藏了正则表达式。可以验证只能输入数...2016-11-25
  • java正则表达式判断前端参数修改表中另一个字段的值

    这篇文章主要介绍了java正则表达式判断前端参数修改表中另一个字段的值,需要的朋友可以参考下...2021-05-07
  • 常用的日期时间正则表达式

    常用的日期时间正则表达式 下面收藏了大量的日期时间正则匹配函数,包括分钟,时间与秒都能达到。 正则表达式 (?n:^(?=d)((?<day>31(?!(.0?[2469]|11))|30(?!.0?2)|29(...2016-11-25
  • PHP正则表达式匹配验证提取网址URL实例总结

    网址规则是可寻的,所以我们可以使用正则表达式来提取字符串中的url地址了,下面一起来看看小编整理的几个PHP正则表达式匹配验证提取网址URL实例. 匹配网址 URL 的...2016-11-25
  • 正则表达式中两个反斜杠的匹配规则详解

    这篇文章主要介绍了正则表达式中两个反斜杠的匹配规则,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-05-07
  • JS中使用正则表达式g模式和非g模式的区别

    这篇文章给大家详细介绍了JS中使用正则表达式g模式和非g模式的区别,非常不错,具有参考借鉴价值,需要的朋友参考下吧...2017-04-03
  • C#正则表达式使用方法示例

    这篇文章主要介绍了C#正则表达式使用方法,大家参考使用...2020-06-25
  • 常用C#正则表达式汇总介绍

    c#正则表达式,用于字符串处理、表单验证等场合,实用高效。现将一些常用的表达式收集于此,以备不时之需。...2020-06-25
  • JavaScript利用正则表达式替换字符串中的内容

    本文主要介绍了JavaScript利用正则表达式替换字符串中内容的具体实现方法,并做了简要注释,便于理解。具有一定的参考价值,需要的朋友可以看下...2017-01-09
  • 一文秒懂python正则表达式常用函数

    这篇文章主要介绍了python正则表达式常用函数及使用方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-05-07
  • Idea使用正则表达式批量替换字符串的方法

    这篇文章给大家介绍了Idea使用正则表达式批量替换字符串的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧...2021-07-21
  • js正则学习小记之匹配字符串字面量

    关于匹配字符串问题,有很多种类型,今天讨论 js 代码里的字符串匹配,因为我想学完之后写个语法高亮练手,所以用js代码当作例子...2021-05-07
  • PHP正则表达式之捕获组与非捕获组

    今天遇到一个正则匹配的问题,忽然翻到有捕获组的概念,手册上也是一略而过,百度时无意翻到C#和Java中有对正则捕获组的特殊用法,搜索关键词有PHP时竟然没有相关内容,自己试了一下,发现在PHP中也是可行的,于是总结一下,分享的同...2015-11-08
  • C# 中使用正则表达式匹配字符的含义

    正则表达式的作用用来描述字符串的特征。本文重点给大家介绍C# 中使用正则表达式匹配字符的含义,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧...2020-06-25
  • Python验证的50个常见正则表达式

    这篇文章主要给大家介绍了关于利用Python验证的50个常见正则表达式的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-11
  • C#编程自学之运算符和表达式

    这篇文章主要介绍了C#运算符和表达式,这是自学C#编程的第五篇,希望对大家的学习有所帮助。...2020-06-25
  • PHP正则表达式过滤html标签属性(DEMO)

    这篇文章主要介绍了PHP正则表达式过滤html标签属性的相关内容,实用性非常,感兴趣的朋友参考下吧...2016-05-06