PHP正则匹配html标签
一、前言
1、匹配字符串时用:.*? 或 [^\<]+\ 或 [^\<]+
2、preg_match匹配结果为1个,preg_match_all匹配结果为多个
3、如果有标签结束,则要加符号\,例如<\/div>,如果只需要匹配标签里的属性,就不需要匹配标签的结束符号<\/标签名>
4、preg_match_all匹配多个时,每一个()里对应一个结果数组,默认匹配返回所有内容,preg_match_all返回的数组数量 = 1 + ()的个数
二、小例子
1、需求:获取下面字符串中EAT的内容
NAME=姓名;AGE=99;EAT=APPLE;TIME=1234567890
2、实现
//获取下面字符串中EAT的值
$string = 'NAME=姓名;AGE=99;EAT=APPLE;TIME=1234567890';
$pattern = '/EAT=([^;]+)/'; //从EAT= 开始匹配 匹配到非;(^;)结束(即匹配到第一个分号结束)
preg_match_all($pattern, $string, $result);
var_export($result);die;
3、打印
array (
0 =>
array (
0 => 'EAT=APPLE',
),
1 =>
array (
0 => 'APPLE',
),
)
4、匹配语句解析
从EAT= 开始匹配 匹配到非;(^;)结束(即匹配到第一个分号结束)
三、代码
<?php
namespace app\index\controller;
class Ablog extends Base
{
public function test4(){
//获取Html字符串
$html = $this->getHtml();
//打印标题
$this->searchTitle($html);
//打印内容
$this->searchContent($html);
}
public function searchContent($html){
// $pattern1 = '/<div class="info" id=".*?">[^\"]+<\/div>/';
$pattern1 = '/<div class="info" id=".*?">[^\<]+\<\/div>/';
// $pattern2 = '/<div class="info" id="(.*?)">([^\"]+)<\/div>/';
$pattern2 = '/<div class="info" id="(.*?)">([^\<]+)<\/div>/';
preg_match($pattern1, $html, $matches1One); //匹配单个
preg_match_all($pattern1, $html, $matches1More); //匹配多个
var_export($matches1One);
<<<EOF
matches1One:打印
array (
0 => '<div class="info" id="96">
回来的时候换了一条路。那里进过广场的公园。一如既往的有好多手机贴膜的小贩还有只有一个板凳面前一张纸卖电话卡的小贩。
</div>',
)
EOF;
var_export($matches1More);
<<<EOF
matches1More:打印
array (
0 =>
array (
0 => '<div class="info" id="96">
回来的时候换了一条路。那里进过广场的公园。一如既往的有好多手机贴膜的小贩还有只有一个板凳面前一张纸卖电话卡的小贩。
</div>',
1 => '<div class="info" id="97">
我看见石榴花开了,红的黄的真的特别的好看。月季依然开得很娇艳。
</div>',
),
)
EOF;
preg_match($pattern2, $html, $matches2One); //匹配所有
preg_match_all($pattern2, $html, $matches2More); //匹配所有
var_export($matches2One);
<<<EOF
matches2One:打印
array (
0 => '<div class="info" id="96">
回来的时候换了一条路。那里进过广场的公园。一如既往的有好多手机贴膜的小贩还有只有一个板凳面前一张纸卖电话卡的小贩。
</div>',
1 => '96',
2 => '
回来的时候换了一条路。那里进过广场的公园。一如既往的有好多手机贴膜的小贩还有只有一个板凳面前一张纸卖电话卡的小贩。
',
)
EOF;
var_export($matches2More);
<<<EOF
matches2More:打印
array (
0 =>
array (
0 => '<div class="info" id="96">
回来的时候换了一条路。那里进过广场的公园。一如既往的有好多手机贴膜的小贩还有只有一个板凳面前一张纸卖电话卡的小贩。
</div>',
1 => '<div class="info" id="97">
我看见石榴花开了,红的黄的真的特别的好看。月季依然开得很娇艳。
</div>',
),
1 =>
array (
0 => '96',
1 => '97',
),
2 =>
array (
0 => '
回来的时候换了一条路。那里进过广场的公园。一如既往的有好多手机贴膜的小贩还有只有一个板凳面前一张纸卖电话卡的小贩。
',
1 => '
我看见石榴花开了,红的黄的真的特别的好看。月季依然开得很娇艳。
',
),
)
EOF;
}
public function searchTitle($html){
$titlePattern1 = '/<h2>.*?<\/h2>/'; //匹配:(h2标签 + 标签里的内容)
$titlePattern2 = '/<h2>(.*?)<\/h2>/';//匹配:(h2标签 + 标签里的内容)和 (h2标签里的内容)
//titlePattern1
preg_match($titlePattern1, $html, $titleMatches1One); //匹配单个
preg_match_all($titlePattern1, $html, $titleMatches1More); //匹配多个
var_export($titleMatches1One);
<<<EOF
titleMatches1One:打印
array (
0 => '<h2>美好的一天</h2>',
)
EOF;
var_export($titleMatches1More);
<<<EOF
titleMatches1More:打印
array (
0 =>
array (
0 => '<h2>美好的一天</h2>',
),
)
EOF;
//titlePattern2
preg_match($titlePattern2, $html, $titleMatches2One); //匹配单个
preg_match_all($titlePattern2, $html, $titleMatches2More); //匹配多个
var_export($titleMatches2One);
<<<EOF
titleMatches2One:打印
array (
0 => '<h2>美好的一天</h2>',
1 => '美好的一天',
)
EOF;
var_export($titleMatches2More);
<<<EOF
titleMatches2More:打印
array (
0 =>
array (
0 => '<h2>美好的一天</h2>',
),
1 =>
array (
0 => '美好的一天',
),
)
EOF;
}
public function getHtml(){
$html = '<html>
<head>
<title>大家好</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<!-- 文章START -->
<div class="whole">
<!-- 标题START -->
<div class="head">
<h2>美好的一天</h2>
<div>
<span>御风剑士</span>
<span>2019-04-24</span>
</div>
</div>
<!-- 标题SEND -->
<!-- 内容START -->
<div class="content">
<a href="http://www.***.com">
<img src="http://images.***.com"/>
</a>
<div class="info" id="96">
回来的时候换了一条路。那里进过广场的公园。一如既往的有好多手机贴膜的小贩还有只有一个板凳面前一张纸卖电话卡的小贩。
</div>
<div class="info" id="97">
我看见石榴花开了,红的黄的真的特别的好看。月季依然开得很娇艳。
</div>
</div>
<!-- 内容END -->
</div>
<!-- 文章END -->
</body>
</html>';
return $html;
}
}