正则匹配div中的a标记的href 和content


        很久后又一次接触正则,那种似曾相似的感觉,你是不是也有这样的感觉,这么小CASE的东西,我一定要把他彻底掌握了,于是花时间看手册,于是就明白了,于是下次又是似曾相似……

总写下今天用到的地方:

//demo

$str = '<div class="test">
        <div class="wcb"><li>li</li>
        <a href="m.vip.com/shoe/47">跑步鞋</a>
        <a href="m.vip.com/shoe/48">篮球鞋</a>
        </div>
        <div class="wcb">tryagin</div>
        </div>';

        // 先匹配出DIV
        preg_match_all('/<div class=\"wcb\">(.*?)<\/div>/i', $str, $matches);

        if(!empty($matches))
        {
            $target_content = $matches[0][0];
        }

        //第二次匹配出其中的a标记,注意()是返回匹配的内容
        preg_match_all('/<a href=\"((?!\/topic\/show).[^<]*)\">(.*?)<\/a>/i', $target_content, $matches_detail);
        if(!empty($matches_detail))
        {
            $href_content = $matches_detail[1];
            $detail_content = $matches_detail[2];
        }

方法:

/**
    * function: 获取主题馆数据
    *
    * @param string  $topic    主题名
    * @param string  $pattern  正则模式
    *
    * @return array  $data  $data['href_content']:链接信息数组;$data['detail_content']:名称信息数组
    */
    private function get_topic_data($topic, $pattern1, $pattern2)
   	{
   		$data = array();

   		if( empty($topic) || empty($pattern1) || empty($pattern2))
   		{
   			return $data;
   		}
   		// 构建主题馆数据
    	// 获取整体数据
    	// 获取页面ID
        $modpage_id = 0;
        $modpages = $this->Modpage_Model->getAllPages();
        foreach($modpages as $one_page) {
            if ($one_page['department'] == $topic) {
                $modpage_id = $one_page['id'];
            }
        }

        // 取信息
        $version_data = $this->Modpage_Model->getCurrentPageVersion($modpage_id);

        $page_info_raw = $this->Modpage_Model->getVersionData($modpage_id, $version_data['version']);

        // 生成数据
        foreach ($page_info_raw as $k => $v)
        {
        	//儿童单独处理
        	if($topic == 'children')
        	{
        		if($v['module_id'] == 1 && $v['desc'] == '快速找宝贝')
        		{
        			$parse_str = $v['content'];
        			break;
        		}
        	}
        	else
        	{
        		// 去后台副导航数据
        		if($v['module_id'] == 4)
	        	{
	        		$parse_str = $v['content'];
	        		break;
	        	}
        	}
        }

    	// 匹配主题馆需要的数据
        // 清洗数据
		$parse_str = $this -> clearData($parse_str);
    	preg_match_all($pattern1, $parse_str, $matches);

        if(!empty($matches))
        {
            $target_content = $matches[0][0];
        }

        // 替换主机名
		$target_content = str_replace($this -> website, TOUCH_URL, $target_content);

		// 清洗数据
        $target_content = $this -> clearData($target_content);

        preg_match_all($pattern2, $target_content, $matches_detail);

        if(!empty($matches_detail))
        {
            $data['href_content'] = $matches_detail[1];
            $data['detail_content'] = $matches_detail[2];
        }
        return $data;
   	}

   	/**
    * function: 清洗数据(过滤字符串中的换行符、制表符)
    *
    * @param string  $str    初始字符串
    *
    * @return string  $str
    */
   	private function clearData( $str )
   	{
   		if( empty($str) )
   		{
   			return '';
   		}
   		// 清除换行符
   		$str = str_replace("\r\n", '', $str);
   		// 清除换行符
		$str = str_replace("\n", '', $str);
		// 清除制表符
		$str = str_replace("\t", '', $str);
		$str = trim( $str );
		return $str;
   	}

//测试方法

/**
    * 首页入口
    *
    */
    public function index() {

    	$data = array();
    	$result = array();

    	// 获取主题馆信息

    	// 主题馆原始数据  array('部门'=>array('类型','正则一','正则二'))
        $topic_name_arr = array(
        	'sports' => array('sport','/<div class=\"spnavdiv\">(.*?)<\/div>/i','/<a target="_blank" href=\"((?!\/topic\/show).[^<]*)\">(.*?)<\/a>/i'),
        	'womenshoes' => array('women','/<div class=\"OB_floatL\">(.*?)<\/div>/i','/<a href=\"((?!\/topic\/show).[^<]*)\" .*?>(.*?)<\/a>/i'),
        	'menshoes' => array('man','/<div class=\"OB_floatL\" .*?>(.*?)<\/div>/i','/<a target="_blank" href=\"((?!\/topic\/show).[^<]*)\">(.*?)<\/a>/i'),
        	'outdoor' => array('outdoor','/<div class=\"navlidiv\" style=\".*?\">(.*?)<\/div>/i','/<a href=\"((?!\/topic\/show).[^<]*)\"  target="_blank" .*?>(.*?)<\/a>/i'),
        	'children' => array('children','/<table class=\"catetable_2\">(.*?)<\/div>/i','/<a href=\"((?!\/topic\/show).[^<]*)\" target="_blank">(.*?)<\/a>/i'),
        	);

        // 组织数据
        foreach ($topic_name_arr as $type => $pattern) {
        	$result = $this -> get_topic_data( $type, $pattern[1], $pattern[2] );
        	$data['data'][$pattern[0]] = $result;
        }

        $h_data['jspath'] = 'index';
        $this->load->view("touch/common/header",$h_data);
        $this->load->view("touch/index/index",$data);
        $this->load->view("touch/common/footer");
    }

应用场景:

<div class="navsubmenu" style="width:280px;left:0"> <span class="arr" style="left:30px;"></span>
          <div class="OB_floatL" style="margin-right:30px">
            <h5 class="subh5">全部男鞋</h5>
            <p><a target="_blank" href="http://m.vip.com/shoe/167"class="hot">休闲鞋</a></p>
            <p><a target="_blank" href="http://m.vip.com/shoe/165">正装鞋</a></p>
            <p><a target="_blank" href="http://m.vip.com/shoe/166" class="hot">商务鞋</a></p>
            <p><a target="_blank" href="http://m.vip.com/shoe/170">凉鞋</a></p>
            <p><a target="_blank" href="http://m.vip.com/shoe/173">户外鞋</a></p>
            <p><a target="_blank" href="http://m.vip.com/shoe/172">帆布鞋</a></p>
            <p><a target="_blank" href="http://m.vip.com/shoe/171">板鞋</a></p>
            <p><a target="_blank" href="http://m.vip.com/shoe/168" class="hot">男靴</a></p>
            <p><a target="_blank" href="http://m.vip.com/shoe/351">棉鞋</a></p>
          </div>
          <div class="OB_floatL" style="margin-right:30px">
            <h5 class="subh5">热门品类</h5>
            <p><a target="_blank" href="http://m.vip.com/topic/show/8049" class="hot">1月新品</a></p>
            <p><a target="_blank" href="http://m.vip.com/search?top_key=%E5%B7%A5%E8%A3%85%E9%9E%8B&new_cat=164" class="hot">工装鞋</a></p>
            <p><a target="_blank" href="http://m.vip.com/search?top_key=%E7%89%9B%E6%B4%A5%E9%9E%8B&new_cat=164">牛津鞋</a></p>
            <p><a target="_blank" href="http://m.vip.com/shoe/168">男靴</a></p>
            <p><a target="_blank" href="http://m.vip.com/shoe/167-11v1585">伐木鞋</a></p>
            <p><a target="_blank" href="http://m.vip.com/search?top_key=%E5%B8%86%E8%88%B9%E9%9E%8B&new_cat=164">帆船鞋</a></p>
             <p><a target="_blank" href="http://m.vip.com/shoe/166">商务皮鞋</a></p>
            <p><a target="_blank" href="http://m.vip.com/shoe/166-16v243">增高鞋</a></p>
            <p><a target="_blank" href="http://m.vip.com/search?gender=1&top_key=%E5%86%9B%E8%AD%A6%E9%9D%B4">军警靴</a></p>
          </div>
</div>

PS:

preg快速查看地址:http://msdn.microsoft.com/zh-cn/library/ae5bf541(v=vs.80).aspx

小结:这是最笨,但是最快解决问题的方法

参考递归实现:http://zhidao.baidu.com/link?url=WYgzZnK-_kD_ooBmH3iALiPniS054Ympziofk0nX1B6Nywy1cPjGfnhSp3PaQ95qw_rEOG-E_GX3t4YFvtQeja

总结:

()可以返回匹配到的内容

时间: 2024-10-29 19:09:45

正则匹配div中的a标记的href 和content的相关文章

php正则匹配html中的带class的div,选取其中的内容

<div class="chartInfo"> <div class="line"></div> <div class="tideTable"> <strong>潮汐表</strong><span style="font-size:12px;font-weight:lighter;margin-left:-20px;">数据仅供参考</s

Java实现正则匹配HTML中获取的图片链接

package demo; import java.io.File; import java.text.Collator; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Demo {

正则匹配括号中内容

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <script> var reg = /\((.+?)\)/g; var reg2 = /\((.+?)\)/; var str = 'scale(1.5)

php正则匹配video 中或者img的宽度和高度。

preg_match('/\bwidth="(\d+)"/',$contentimages, $vwith);//宽 preg_match('/\bheight="(\d+)"/',$contentimages, $vheight);//高 原文地址:https://www.cnblogs.com/xiager/p/8252819.html

PHP 正则表达式匹配 img ,PHP 正则提取或替换图片 img 标记中的任意属性。

PHP正则提取或替换img标记属性 PHP 正则表达式匹配 img ,PHP 正则提取或替换图片 img 标记中的任意属性. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 <?php /*PHP正则提取图片img标记中的任意属性*/ $str = '<center><img src="/uploads/images/20100516000.jpg"

关于php中正则匹配包括换行符在内的任意字符的问题总结

要使用正则匹配任意字符的话,通常有以下几种方法,这里我分别对每一种方法在使用的过程中做一个总结: 第一种方式:[.\n]*? 示例 ? PHP preg_match_all('/<div class="list">[.\n]*?<\/div>/i', $content, $data); 按道理这种方式应该是可以的,但我测试发现不行,因为这里中括号里面的“.”被当作一个普通的英文句号去处理了,而不是通配符,因此这里只能匹配到包含英语句号及换行符在内的任意内容了.

iOS 中的正则匹配(工具类)

正则表达式 正则表达式是对字符串操作的一种逻辑公式, 用事先定义好的一些特定字符.及这些特定字符的组合, 组成一个"规则字符串", 这个"规则字符串"用来表达对字符串的一种过滤逻辑, 正则表达式就是用于描述这些规则的工具, 或者说, 正则表达式就是记录文本规则的代码. 在开发中, 我们经常会有查找符合某些复杂规则的字符串的需要, 比如数据校验: 判断用户的输入是否合法(如:用户注册的时候,QQ号码,电话号码,邮箱是否符合要求) 下面让我们先来看看正则匹配常用的一些字

利用Python正则匹配中文——爬取校园网公告栏中感兴趣的内容

写这个程序是因为校园网公告栏时不时会有学术报告,讲座之类的信息发布,但这类信息往往发布在讲座的前一天,以至于丢失很多重要消息.同时公告栏里也会发布一些跟学生无关的内容,比如工会主席会议啥的. 主要遇到的困难时对中文的正则匹配问题.(比如通过第一次正则可以提取到一个页面内的所有中文标题,第二次正则从这些中文标题中将能匹配上“报告”两个字的对象添加到结果list内) 学校公告页面是gb2312编码.我使用的方式是,整个工程使用utf-8编码,将需要匹配的关键字转换成utf-8编码格式,使用正则匹配u

正则匹配中 ^ $ 和 \b 的区别

正则匹配中 ^ $ 和 \b 的区别 ^和$分别代表字符串的开始和结束,因此^\d$只能匹配包含一个数字的字符串\b代表单词边界,其前后必须是不同类型的字符,可以组成单词的字符为一种类型,不可组成单词的字符(包括字符串的开始和结束)为另一种类型因此\b\d\b可以匹配"%3%"中的3,但不能匹配"23"中的任意一个数字