这几天一直在百度知道转悠,尝试着解决自己能够解决的问题,从而达到助人为乐的乐趣。(窃笑一下,实际是通过回答别人的问题,达到提升自己的目的;)

转悠了一会,发现有好多朋友提问“PHP怎么读取内容内的图片?”诸如此类的问题。

大多数情况,都是推荐使用正则表达式;不过正则表达式对于我来讲真的不是太懂,曾经有花时间了解过每个字符的作用和使用方法,可长时间不用,早就忘得一干二净了。

面对这样的问题,不能盲目回答,误人子弟的后果很严重啊。。。。查查资料吧

什么是正则表达式?

正则表达式定义

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

特别字符的使用说明

特别字符 说明

$ 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 'n' 或 'r'。要匹配 $ 字符本身,请使用 $。

( ) 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 ( 和 )。

* 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 *。

+ 匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 +。

. 匹配除换行符 n之外的任何单字符。要匹配 .,请使用 。

[ 标记一个中括号表达式的开始。要匹配 [,请使用 [。

? 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 ?。

将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, 'n' 匹配字符 'n'。'n' 匹配换行符。序列 '' 匹配 "",而 '(' 则匹配 "("。

^ 匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。要匹配 ^ 字符本身,请使用 ^。

{ 标记限定符表达式的开始。要匹配 {,请使用 {。

| 指明两项之间的一个选择。要匹配 |,请使用 |。

构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与操作符将小的表达式结合在一起来创建更大的表达式。正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。

执行选项说明

了解了常见的一些特别字符的含义和正则表达式的构造方法后,再来看看表达式中 /i、/s、/is、/isU等代表着什么意思:

i - 匹配大小写

s - 模式中的圆点元字符(.)匹配所有的字符,包括换行符

x - 模式中的空白字符除了被转义的或在字符类中的以外完全被忽略,在未转义的字符类之外的 # 以及下一个换行符之间的所有字符,包括两 头,也都被忽略

A (PCRE_ANCHORED) - 如果设定了此修正符,模式被强制为“anchored”,即强制仅从目标字符串的开头开始匹配即自动在模式开头加上^。

D (PCRE_DOLLAR_ENDONLY) - 如果设定了此修正符,模式中的美元元字符仅匹配目标字符串的结尾。没有此选项时,如果最后一个字符是换行符的话,美元符号也会匹配此字符之前(但不会匹配 任何其它换行符之前)。如果设定了 m 修正符则忽略此选项。Perl 中没有与其等价的修正符。 S 当一个模式将被使用若干次时,为加速匹配起见值得先对其进行分析。如果设定了此修正符则会进行额外的分析。目前,分析一个模式仅对没有单一固定起始字符的 non-anchored 模式有用。

U (PCRE_UNGREEDY) - 本修正符反转了匹配数量的值使其不是默认的重复,而变成在后面跟上“?”才变得重复。这和 Perl 不兼容。也可以通过在模式之中设定 (?U) 修正符来启用此选项。

X (PCRE_EXTRA) - 此 修正符启用了一个 PCRE 中与 Perl 不兼容的额外功能。模式中的任何反斜线后面跟上一个没有特殊意义的字母导致一个错误,从而保留此组合以备将 来扩充。默认情况下,和 Perl 一样,一个反斜线后面跟一个没有特殊意义的字母被当成该字母本身。当前没有其它特性受此修正符控制。即:贪婪模式,最 大限度匹配 如:/a[w]+?e/U匹配abceadeddd中的abceade而不是abce,如果不加U修正,则匹配abce u (PCRE_UTF8) 此修正符启用了一个 PCRE 中与 Perl 不兼容的额外功能。模式字符串被当成 UTF-8。本修正符在 Unix 下自 PHP 4.1.0 起可用,在 win32 下自 PHP 4.2.3 起可用。

认识PHP的PREG_MATCH_ALL函数

PREG_MATCH_ALL的说明

有了以上关于正则表达式的基础知识回顾后,我们再来看看PREG_MATCH_ALL这个函数的基本知识:

preg_match_all -- 进行全局正则表达式匹配

说明 :

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

搜索subject中所有匹配pattern给定正则表达式 的匹配结果并且将它们以flag指定顺序输出到matches中.

自第一个匹配找到后, 子序列继续从最后一次匹配位置搜索.

参数:

pattern

要搜索的模式, 字符串形式.

subject

输入字符串.

matches

多维数组, 作为输出参数输出所有匹配结果, 数组排序通过flags指定.

flags

可以结合下面标记使用(注意不能同时使用PREG_PATTERN_ORDER和 PREG_SET_ORDER):

PREG_PATTERN_ORDER

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

PREG_MATCH_ALL的示例

preg_match_all("|]+>(.*)[^>]+>|U",

"example:

this is a test

",

$out, PREG_PATTERN_ORDER);

echo $out[0][0] . ", " . $out[0][1] . "n";

echo $out[1][0] . ", " . $out[1][1] . "n";

?>

以上例程会输出:

example: ,

this is a test

example: , this is a test

因此, $out[0]是包含匹配完整模式的字符串的数组, $out[1]是包含闭合标签内的字符串的数组.

嗯。差不多知道些正则匹配的道道了。

执行图片路径匹配

问题描述

接下来我们就用PREG_MATCH_ALL来试试手吧。

Q:如何获取下面一段文本内的图片路径?

查看百度知道LOGO

解决方法

A:利用PREG_MATCH_ALL,具体代码如下:

$response = ''

.'查看百度知道LOGO';

preg_match_all("/(href|src)=(["|']?)([^"'>]+.(jpg|JPG|jpe|JPE|jpeg|JPEG|gif|GIF|png|PNG))/i",$response,$matches);

var_dump($matches);

执行后的结果为:

array(5) {

[0] => array(2) {

[0] => string(45) "src="http://img.baidu.com/img/logo-zhidao.gif"

[1] => string(46) "href="http://img.baidu.com/img/logo-zhidao.gif"

}

[1] => array(2) {

[0] => string(3) "src"

[1] => string(4) "href"

}

[2] => array(2) {

[0] => string(1) """

[1] => string(1) """

}

[3] => array(2) {

[0] => string(40) "http://img.baidu.com/img/logo-zhidao.gif"

[1] => string(40) "http://img.baidu.com/img/logo-zhidao.gif"

}

[4] => array(2) {

[0] => string(3) "gif"

[1] => string(3) "gif"

}

}

过程解析

让咱们对比结果,回头来看看这个表达式,分析分析为什么要这样构造表达式;

为什么得出的结果会有5组数据?

先从上面的preg_match_all函数的基础知识中,再了解一下flags的作用(留意上面加粗部分的文字),默认值为PREG_PATTERN_ORDER;这样一结合起来看,就明白结果中,第一组数据的来源了。

[0] => array(2) {

[0] => string(45) "src="http://img.baidu.com/img/logo-zhidao.gif"

[1] => string(46) "href="http://img.baidu.com/img/logo-zhidao.gif"

}

在继续之前再来强调一下特殊字符()的作用:标记一个子表达式的开始和结束位置。

1、对比matches[1]的内容

(href|src)

2、对比matches[2]的内容

(["|']?)

3、对比matches[3]的内容

([^"'>]+.(jpg|JPG|jpe|JPE|jpeg|JPEG|gif|GIF|png|PNG))

4、对比matches[4]的内容

(jpg|JPG|jpe|JPE|jpeg|JPEG|gif|GIF|png|PNG)

写到这里,我怎么突然感觉没必要再罗嗦了?!!

什么?还不知道怎么从得到的结果中取出路径?来段代码:

$match = $matches[3];

if ( $match ){

foreach($match as $path){

var_dump( $path );

}

}

php 匹配图片路径_PHP笔记(一):如何利用正则匹配图片路径相关推荐

  1. Python练习篇25-re模块利用正则匹配提取网页邮箱并保存

    本文介绍re模块利用正则匹配提取网页邮箱并保存 提取网页邮箱我们需要用到requests模块.re模块和xlwt模块(下载方法:打开cmd,输入pip install 包名),负责去匹配邮箱数据. 本 ...

  2. 图片播放器的实现1——利用Image2LCD提取图片数据并显示

    以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除. 参考内容 (1)https://xiefor100.blog.csdn.net/article/details/71941527 (2) ...

  3. php正则匹配函数字符串长度,PHP中preg_match函数正则匹配的字符串长度问题

    PHP中preg_match函数正则匹配的字符串长度问题 发布于 2015-10-25 10:24:29 | 166 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: ...

  4. 利用正则匹配数字后边的字符_图解正则——字符匹配

    简介 正则表达式是绕不开的,正则的强大是众所周知的,学会它对我们的编程也是有大大的帮助 模糊匹配 正则表达式之所以强大,就要归功于它的模糊匹配,不能可以匹配不同数量的字符串,还可以匹配不同内容的字符串 ...

  5. 利用正则匹配url是否合法对于有的url会浪费过长时间使程序卡死,切记!

    改进:改成匹配url是否为以某个结尾的,至于非法的url就让Jsoup.connect(url)把异常抛弃 //启动该正则匹配特别的慢 // public static String regex = ...

  6. EXCEL利用正则匹配去替换内容

    做项目过程中需要对某一列字段进行添加"[]"将字段包裹起来,因此上网查了EXCEL的正则匹配如何使用,在此记录一下,防止忘记. 打开文件一定要选择EXCEL打开,WPS目前没有发现 ...

  7. 一篇文章打通PostgreSql(pgsql)的正则匹配: like, similar to, ~。 以及与 mysql 正则匹配的区别。

    1. like 模糊匹配 like 是最简单的最通用的匹配符, 用法同 mysql 1)  _ : 匹配任意一个字符 2) % : 匹配任意个任意字符 例如 : 要从表aaa中查询 字段bbb 倒数第 ...

  8. 微信图片防盗链笔记(转:破解微信图片防盗链)

    首先,引用微信的图片遇到的情况: 解决: 1.尝试在html头中加入<meta name="referrer" content="never"> 问 ...

  9. css如何将图片调成合适大小,如何利用CSS自动调整图片的大小

    经常更换wordpress主题,会有一个困扰,就是之前主题的内容区域宽度比较大,很多正文图片的尺寸可能是500px,而换了一个主题,内容区域的宽度比较小,假设是400px, 这时原先的图片宽度都是50 ...

最新文章

  1. Java中的goto实现
  2. 关于AJAX跨域调用ASP.NET MVC或者WebAPI服务的问题及解决方案
  3. R语言XML格式数据导入与处理
  4. [vue] watch和计算属性有什么区别?
  5. python 封装函数_python:函数数据封装
  6. Node.js下载安装及各种npm、cnpm、nvm、nrm配置(保姆式教程---提供全套安装包)---npm的安装与配置(2)
  7. mysql5.7非源码版msi安装教程
  8. Python版本的查看
  9. 微信小程序云开发-支付
  10. shark恒破解笔记5-VB之rtcMsgBox
  11. 28部漫威电影按漫威时间全梳理
  12. 2017第八届蓝桥杯决赛(大学B组)java试题 瓷砖样式
  13. Decision Model and Notation (DMN)
  14. Selenium运行IE报错This usually means that a call to the COM method IWebBrowser2::Navigate2() failed.解决方案
  15. 强一致性 弱一致性 最终一致性
  16. 使用Python,OpenCV构建移动文档扫描仪
  17. 拼音魔法-华东师范大学程序设计竞赛-ecnu3256
  18. 单侧游离端缺失设计图_单侧游离端附着体义齿的应力中断设计及其力学传导分析...
  19. 不明真相的http code 497
  20. 我的世界java营火如何合成_营火 - Minecraft Wiki,最详细的官方我的世界百科

热门文章

  1. 在自我导向行为中使用“意志力”这个概念有什么问题?
  2. C语言 判断平年闰年判断
  3. 唯一邀请码生成(Java版本)
  4. YUYV422 转 YUV420 代码
  5. linux环境变量生效方式,Linux中修改环境变量及生效方法
  6. 探究Fingerprintjs:了解浏览器指纹技术的原理和应用
  7. Javascript数组补充
  8. 【小红书】2020校招编程题
  9. 强狄里克雷逼近定理的证明
  10. Django框架设置cookies与获取cookies操作详解