PHP正则匹配html标签

                                                    PHP正则匹配html标签

一、前言

1、匹配字符串时用:.*? 或 [^\<]+\ 或 [^\<]+
2、preg_match匹配结果为1个,preg_match_all匹配结果为多个
3、如果有标签结束,则要加符号\,例如<\/div>,如果只需要匹配标签里的属性,就不需要匹配标签的结束符号<\/标签名>
4、preg_match_all匹配多个时,每一个()里对应一个结果数组,默认匹配返回所有内容,preg_match_all返回的数组数量 = 1 + ()的个数
5、相关文章 正则表达式 - php正则匹配内容?https://www.php.cn/php-weizijiaocheng-285574.html

二、小例子

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;
    }
}

 

  • 0
    点赞
  • 1
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:创作都市 设计师:CSDN官方博客 返回首页
评论

打赏作者

夏已微凉、

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值