首页 > 编程技术 > php

PHP正则匹配img及标签各属性值(匹配图片函数)

发布时间:2016-11-25 17:42

有一个项目要获取页面中所有img标签中的图片地址,这里我们使用到了preg_match_all正则函数,然后看我下面的一些参数即可实现了。

 代码如下 复制代码

<?php

 
$ext = 'jpg|jpeg|gif|bmp|png';//罗列图片后缀从而实现多扩展名匹配
$str = '<p><img title="湛蓝天空" alt="湛蓝天空" onload="ResizeImage(this,860)"" width=100% src="http://你的域名/uploads/allimg/131121/1-1311210925190-L.jpg" /></p><p><img title="湛蓝天空" alt="湛蓝天空" onload="ResizeImage(this,860)"" width=100% src="http://你的域名/uploads/allimg/130814/1-130Q42211190-L.jpg" /></p><p><img title="湛蓝天空" alt="湛蓝天空" onload="ResizeImage(this,860)"" width=100% src="http://你的域名/uploads/allimg/130923/1-130923233I30-L.jpg" /></p>';
 
 
$img_list = array(); //这里存放结果map
$img_list = img_match($str,$ext);
print_r($img_list); //查看结果变量
 
/*
* $str,要进行处理的内容
* $ext,要匹配的扩展名
*/
 
function img_match($str,$ext){
 
$list = array(); //这里存放结果map
$c1 = preg_match_all('/<imgs.*?>/', $str, $m1); //先取出所有img标签文本
for($i=0; $i<$c1; $i++) {    //对所有的img标签进行取属性
$c2 = preg_match_all('/(w+)s*=s*(?:(?:(["'])(.*?)(?=2))|([^/s]*))/', $m1[0][$i], $m2); //匹配出所有的属性
for($j=0; $j<$c2; $j++) { //将匹配完的结果进行结构重组
$list[$i][$m2[1][$j]] = !empty($m2[4][$j]) ? $m2[4][$j] : $m2[3][$j];
}
}
 
return $list;
}
 
?>

效果如下

PHP正则匹配img及标签各属性值(匹配图片函数)

再扯蛋一下,还是正则取指定字符中的内容

 代码如下 复制代码

$str = preg_match_all('/(original-title=).*?(>)/is', $str,$array);

很简单吧。

isU是大小写分的意思,这里s还有则不包括换行符而U是反转了匹配数量的值使其不是默认的重复,大概就是这样了个体我们看文章。

正则后面的/(.*)/isU  ,“isU”参数代表什么意思?
这是正则中的修正符.
i是同时查找大小写字母,
s是圆点(.)匹配所有字符,包括换行符.如果没有设定s,则不包括换行符.
U是反转了匹配数量的值使其不是默认的重复,而变成在后面跟上“?”才变得重复

preg_match 兼容的正则表达式语法中 b 代表单词边界
所以:下面应该是可以???

 代码如下 复制代码

$a="test,admin,abc";

$b="te";

$exist=preg_match("/b{$b}b/",$a);

if($exist)

{

echo "存在";

}else

{
echo "不存在";
}


看一下相关说明

int preg_match ( string pattern, string subject [, array matches [, int flags]] );
preg_match() 返回 pattern 所匹配的次数。要么是 0 次(没有匹配)或 1 次,因为 preg_match() 在第一次匹配之后将停止搜索。preg_match_all() 则相反,会一直搜索到 subject 的结尾处。如果出错 preg_match() 返回 false。
示例:

 代码如下 复制代码

<?php

$a = "abcdefgabcdefaaag";

preg_match('|abc([a-z]+)g|isu',$a,$out1);

preg_match_all('|abc([s]+)g|isu',$a,$out2);

echo "<pre>";

print_r($out1);

 

print_r($out2);

echo "</pre>";

?>

写法:
使用双引号时和单引号的不同

 代码如下 复制代码

<?php

preg_match_all("/href="(.*)"/isu",$contents,$out);

preg_match_all('|href="(.*)"|isu',$contents,$out);

?>

正则替换在php中使用preg_replace中执行正则表达式即可,下面我整理了一些简单的例子,希望对各位朋友会有所帮助。

PHP正则表达式替换的相关概念:

preg_replace:执行正则表达式的搜索和替换

mixed preg_replace (   mixed pattern,   mixed replacement,   mixed subject [, int limit]) preg_replace:允许你替换字符串中匹配到你定义的正则表达式。


一个简单的注释移除功能:

 代码如下 复制代码

preg_replace('[(/*)+.+(*/)]', '', $val);


这段代码可以移除在 PHP 和 CSS 中使用 /* 注释 */ 格式的多多行注释。其中的三个参数分别为正则表达式,要替换成的字符串和要替换的目标字符串(这里要做移除功能,所以是个空白字符串 -> '')。如果你想匹配次级规则,可以使用 $0 代表全部匹配,$1、$2 等,以此类推代表分别的次级规则。

在 subject 中搜索 pattern 模式的匹配项并替换为 replacement。如果指定了 limit,则仅替换 limit 个匹配,如果省略 limit 或者其值为 -1,则所有的匹配项都会被替换。

replacement 可以包含 //n 形式或(自 PHP 4.0.4 起)$n 形式的逆向引用,首选使用后者。每个此种引用将被替换为与第 n 个被捕获的括号内的子模式所匹配的文本。n 可以从 0 到 99,其中 //0 或 $0 指的是被整个模式所匹配的文本。对左圆括号从左到右计数(从 1 开始)以取得子模式的数目。

对替换模式在一个逆向引用后面紧接着一个数字时(即:紧接在一个匹配的模式后面的数字),不能使用熟悉的 //1 符号来表示逆向引用。举例说 //11,将会使 preg_replace() 搞不清楚是想要一个 //1 的逆向引用后面跟着一个数字 1 还是一个 //11 的逆向引用。本例中的解决方法是使用 /${1}1。这会形成一个隔离的 $1 逆向引用,而使另一个 1 只是单纯的文字。


例子1:

 代码如下 复制代码

$jobname="行政办—RH021001前台秘书(职位编号:RH021001)";
$jobname=preg_replace("/(.*)/","",$jobname);
$jobname=preg_replace("/.*—.*01/","",$jobname);
//输出:前台秘书

例子2:

 代码如下 复制代码

$str="<a href="space.php?uid=109">fsb</a>";s<a href="space.php?uid=109&do=thread&id=174">注意调节心态 预防职场心理疲劳</a>";
 
$str=preg_replace("/space.php?uid=(d+)&do=thread&id=(d+)/","/space-0-do-thread-id-${2}.html",$str);
$str=preg_replace("/space.php?uid=(d+)/","/space-${1}.html",$str);
 
//输出:<a href="space.php?uid=109">fsb</a>";s<a href="/space-0-do-thread-id-174.html">注意调节心态 预防职场心理疲劳</a>


例子3: 正则提取或替换img标记属性

 

 代码如下 复制代码

<?php

/*PHP正则提取图片img标记中的任意属性*/
$str = '<center><img" width=100% src="/uploads/images/20100516000.jpg" height="120" width="120"><br />PHP正则提取或更改图片img标记中的任意属性</center>';

//1、取整个图片代码
preg_match('/<s*imgs+[^>]*?srcs*=s*('|")(.*?)\1[^>]*?/?s*>/i',$str,$match);
echo $match[0];

//2、取width
preg_match('/<img.+(width="?d*"?).+>/i',$str,$match);
echo $match[1];

//3、取height
preg_match('/<img.+(height="?d*"?).+>/i',$str,$match);
echo $match[1];

//4、取src
preg_match('/<img.+src="?(.+.(jpg|gif|bmp|bnp|png))"?.+>/i',$str,$match);
echo $match[1];

/*PHP正则替换图片img标记中的任意属性*/
//1、将src="/uploads/images/20100516000.jpg"替换为src="/uploads/uc/images/20100516000.jpg")
print preg_replace('/(<img.+src="?.+)(images/)(.+.(jpg|gif|bmp|bnp|png)"?.+>)/i',"${1}uc/images/${3}",$str);
echo "<hr/>";

//2、将src="/uploads/images/20100516000.jpg"替换为src="/uploads/uc/images/20100516000.jpg",并省去宽和高
print preg_replace('/(<img).+(src="?.+)images/(.+.(jpg|gif|bmp|bnp|png)"?).+>/i',"${1} ${2}uc/images/${3}>",$str);

?>

本文章给大家分享一篇php正则表达式子模式的反向引用学习笔记,希望此教程对各位朋友有帮助哦。

需要用正则表达式获取字符串的标题。标题标签是h1~h6。
使用正则表达式:"@<h([1-6])>(.*?)</h\\1>@"或者'<h([1-6])>(.*?)</h\1>@'。使用了@作为分隔符,注意单双引号的差别\\1与\1.

例1

 

 代码如下 复制代码

<?php
$str='<h1>php php php php php php1</h1><h2>php php php php php php2</h2><h3>php php php php php php3</h3><h4>php php php php php php4</h4>';
preg_match_all("@<h([1-6])>(.*?)</h\\1>@",$str,$all);
print_r($all);
?>

结果
Array
(
    [0] => Array
        (
            [0] => <h1>php php php php php php1</h1>
            [1] => <h2>php php php php php php2</h2>
            [2] => <h3>php php php php php php3</h3>
            [3] => <h4>php php php php php php4</h4>
        )

    [1] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
            [3] => 4
        )

    [2] => Array
        (
            [0] => php php php php php php1
            [1] => php php php php php php2
            [2] => php php php php php php3
            [3] => php php php php php php4
        )

)

例2

mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit])

功能

在 subject 中搜索 pattern 模式的匹配项并替换为 replacement。如果指定了 limit,则仅替换 limit 个匹配,如果省略 limit 或者其值为 -1,则所有的匹配项都会被替换。
replacement可以包含\\n形式或$n形式的逆向引用,n可以为0到99,\\n表示匹配pattern第n个子模式的文本,\\0表示匹配整个pattern的文本。

子模式

$pattern参数中被圆括号括起来的正则表达式,子模式的数目即从左到右圆括号的数目。(pattern即模式)


例1:最简单最有用的例子是确定文字中连续出现两个相同单词的位置

 代码如下 复制代码


<?php
$string = "Is is the cost of of gasoline going up up";
$pattern = "/\b([a-z]+) \\1\b/i"; //这里的\\1不能使用\$1或$1
$str = preg_replace($pattern, "\\1", $string); //这里的\\1可以使用\$1或$1,引用第一个子匹配
echo $str; //效果是Is the cost of gasoline going up
?>

例中的子表达式就是圆括号内的项。\b匹配单词的开始或结束。+匹配重复一次或更多次。
该子表达式匹配的是一个或多个字母字符的单词,即由'[a-z]+'匹配的。

该正则表达式的第二部分是对前面所捕获的子匹配的引用,也就是由附加表达式所匹配的第二次出现的单词,用'\\1'来引用第一个子匹配,第一个\是转义符。

i是正则表达式中的修正符。i:忽略大小写。


例3:

正则表达式的逆向引用($0-99或\\0-99)和子模式以(/()/)开始。
这里$0是全部匹配模式的匹配项。$1是第1个子匹配,$2至$99依次是第2个至第99个子匹配。
用$1-99后向引用子匹配时,如果后面的字符是数字,要用花括号区别开。例:${1}1 。

 代码如下 复制代码

<?php
$string = "{April 15, 2003}";

//'w'匹配字母、数字和下划线,'d'匹配0-99数字,'+'匹配重复一次或更多次。
$pattern = "/{(\w+) (\d+), (\d+)}/i"; //在字符串中要搜索的匹配项
$replacement1 = "\${1}1,\$3";
$replacement2 = "\$0";
$replacement3 = "\$1";
$replacement4 = "\$2";
$replacement5 = "\$3";
echo "<BR>";

//字符串被替换为与第n个被捕获的括号内的子模式所匹配的文本
print preg_replace($pattern, $replacement1, $string);
echo "<BR>";
print preg_replace($pattern, $replacement2, $string);
echo "<BR>";
print preg_replace($pattern, $replacement3, $string);
echo "<BR>";
print preg_replace($pattern, $replacement4, $string);
echo "<BR>";
print preg_replace($pattern, $replacement5, $string);
echo "<BR>";

//一般表现形式
print preg_replace("/\w+/i","j",$string);
?>

效果:
April1,2003
{April 15, 2003}
April
15
2003
{j j, j}

测试已通过。

在php正则表达式中如果要匹配重复字符我们需要使用?或*号或者+号来作为正则的前原子,如/(?:dx)+/就是匹配有dx字符的内容了,下面我一起来看看。

则表达式获取字符串的重复情况需要对指定的字符串使用括号()进行分组,但不想让圆括号中的字模式匹配的文本出现在包含匹配文本的数组中,可以使用问号冒号?:
把?:放在第一个圆括号的后面就可以。

例如匹配dx在字符串中重复的情况使用/(?:dx)+/,加号表示dx出现1次或是多次

 代码如下 复制代码

<?php
$str='1.aadxaaa 2.bdxdxbb2bbb 3.cccc2ccc 4.dxdxdxdddddxdxdx';
preg_match_all("/(?:dx)+/",$str,$all);
print_r($all);
?>

输出:

Array
(
    [0] => Array
        (
            [0] => dx
            [1] => dxdx
            [2] => dxdxdx
            [3] => dxdxdx
        )

)

基于知识补充

正则表达式中有一些用于重复匹配其前原子的元字符:“?”、“*”、“+”。他们主要的不同是重复匹配的次数不同。

元字符“?”表示0次或1次匹配紧接在其前的原子。例如:/colou?r/匹配“colour”或“color”。
元字符“*”表示0次、1次或多次匹配紧接在其前的原子。例如://可以匹配“

”、“”或“”等HTML标签,并且不严格的控制大小写。
元字符“+”表示1次或多次匹配紧接在其前的原子。例如:/go+gle/ 匹配“gogle”、“google”或“gooogle”等中间含有多个o的字符串。上文中提及的十六进制数字的例子,实际上更加完善的匹配表达式是/0?[ xX][0-9a-fA-F]+/,可以匹配“0x9B3C”或者“X800”等。
要准确地指定原子重复的次数,还可以使用元字符“{}”指定所匹配的原子出现的次数。“{m}”表示其前原子恰好出现m次;“{m,n}”表示其前原子至少出现m次,至多出现n次;“{m,}”表示其前原子出现不少于m次。

以下是一些示例。

/zo{1,3}m/只能匹配字符串“zom”、“zoom”、或“zooom”。
/zo{3}m/只能匹配字符串“zooom”
/zo{3,}m/ 可以匹配以 “z” 开头,“m”结束,中间至少为3个“o”的字符串。
/bo{0,1}u/可以匹配字符串“bought a butter” 中的“bou”和“bu”,起完全等价于/bo?u/。

标签:[!--infotagslink--]

您可能感兴趣的文章: