PHP正则表达式高效采集网址的优化技巧

优采云 发布时间: 2023-03-06 21:13

  在当今数字化时代,网络上的信息资源越来越丰富,但如何高效地获取这些信息却是一个大问题。而PHP正则表达式恰好提供了一种有效的解决方案,可以用它轻松地采集网站上的各种数据,本文将深入探讨PHP正则表达式在采集网址方面的应用。

  一、什么是PHP正则表达式?

  PHP正则表达式是一种编程语言中常用的搜索和替换工具,它可以根据一定的规则来匹配字符串中的内容。通过使用正则表达式,我们可以快速地查找、筛选和替换文本中的特定字符或字符串。而这种技术在网页爬虫、数据挖掘等领域中得到了广泛应用。

  二、如何使用PHP正则表达式采集网址?

  1.获取HTML源代码

  要想采集网址,首先需要获取网页源代码。可以使用file_get_contents()函数或者curl库来实现此功能。

  ```php

  //使用file_get_contents()函数获取HTML源码

  $html = file_get_contents('http://www.example.com');

  //使用curl库获取HTML源码

  $ch = curl_init();

  curl_setopt($ch, CURLOPT_URL,'http://www.example.com');

  curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);

  $html = curl_exec($ch);

  curl_close($ch);

  ```

  2.使用正则表达式匹配URL

  获取HTML源代码后,就可以通过正则表达式来匹配其中的URL了。以下是一个简单的示例:

  ```php

  //匹配所有以http或https开头的URL

  preg_match_all('/https?:\/\/\S+/',$html,$matches);

  //输出匹配结果

  print_r($matches[0]);

  ```

  以上代码将输出所有以http或https开头的URL。

  三、如何优化PHP正则表达式?

  虽然PHP正则表达式非常强大,但如果不加优化地使用,可能会造成性能问题。因此,在实际应用中我们需要注意以下几点:

  1.尽量使用非贪婪匹配

  贪婪匹配会尽可能多地匹配符合条件的字符,而非贪婪匹配只会匹配符合条件的最少字符。在实际应用中,如果你需要匹配一个字符串中多个子串时,最好使用非贪婪匹配。

  例如,在以下字符串中匹配所有a标签:

  ```html

  Example

  Google

  ```

  使用贪婪匹配:

  ```php

  preg_match_all('/(.*?)/',$html,$matches);

  

  ```

  使用非贪婪匹配:

  ```php

  preg_match_all('/]*>(.*?)/',$html,$matches);

  ```

  2.避免过度捕获

  过度捕获是指在正则表达式中包含过多不必要的子模式。这会导致正则表达式变得复杂和低效。因此,在编写正则表达式时应该尽可能避免过度捕获。

  例如,在以下字符串中提取数字:

  ```html

  $ 100

  ```

  正确做法是:

  ```php

  preg_match('/\d+/',$html,$match);

  ```

  而不是:

  ```php

  preg_match('/.*?$(\d+)/',$html,$match);

  ```

  3.合理使用缓存

  为了提高性能,在对同一个字符串进行多次匹配时可以考虑启用缓存功能。缓存功能可以避免重复计算已经计算过的结果。

  例如,在以下代码中需要对同一个字符串进行多次匹配:

  ```php

  $html = file_get_contents('http://www.example.com');

  preg_match_all('/]*>(.*?)/',$html,$matches1);

  //对同一个字符串再次进行匹配

  preg_match_all('/]*src="(.*?)"/',$html,$matches2);

  //对同一个字符串再次进行匹配

  preg_match_all('/(.*?)/',$html,$matches3);

  ```

  为了提高性能,可以启用缓存功能:

  ```php

  $html = file_get_contents('http://www.example.com');

  $cache_key = md5($html);

  if (!isset($cache[$cache_key])){

   preg_match_all('/]*>(.*?)/',$html,$matches1);

  

   preg_match_all('/]*src="(.*?)"/',$html,$matches2);

   preg_match_all('/(.*?)/',$html,$matches3);

   //缓存结果

   $cache[$cache_key]= array(

   'matches1'=>$matches1,

   'matches2'=>$matches2,

   'matches3'=>$matches3,

   );

  }

  //输出结果

  print_r($cache[$cache_key]);

  ```

  四、如何处理采集到的网址?

  当我们成功地采集到了一些URL后,接下来就需要对这些URL进行处理了。以下是几个常见的处理方式:

  1.提取域名

  有时候我们只需要提取URL中的域名部分。可以使用parse_url()函数来实现此功能。

  例如:

  ```php

  $url ='http://www.example.com/path/to/file.html';

  $domain = parse_url($url, PHP_URL_HOST);

  echo 'Domain:'.$domain;

  ```

  以上代码将输出:Domain: www.example.com。

  2.去重

  如果我们需要处理大量URL时,很可能会出现重复URL的情况。为了避免重复处理相同内容,我们需要对URL进行去重操作。

  例如:

  ```php

  $urls = array(

   'http://www.example.com',

   'http://www.google.com',

   'http://www.example.com',

   'http://www.baidu.com',

  );

  $urls = array_unique($urls);

  print_r($urls);

  ```

  

  以上代码将输出去重后的结果。

  3.过滤无效链接

  有些页面上可能存在无效链接或者跳转链接等不必要的链接。为了避免浪费时间和资源去处理这些链接,我们可以对其进行过滤操作。

  例如,在以下页面中过滤掉所有跳转链接和无效链接:

  ```html

  Example

  Click me

  Home

  File

  Google

  Twitter

  ```

  正确做法是:

  ```php

  $urls = array(

   'Example',

   'Click me',

   'Home',

   'File',

   'Google',

   'Twitter',

  );

  foreach ($urls as &$url){

   if (strpos($url,'javascript:')===0){

   //过滤掉所有跳转链接和无效链接

   unset($url);

   } else {

   //提取所有有效链接并格式化为绝对路径

   preg_match('/href=[\'"]?(.*?)[\'"\s]/',$url,$match);

   if (isset($match[1])){

   //将相对路径转换为绝对路径(可选)

   //$match[1]= url_to_absolute('http://www.example.com', trim(html_entity_decode($match[1]),'"\''));

   //var_dump($match[1]);

   //$url = sprintf('%s', htmlentities(trim(strip_tags(str_replace(array("\r\n","\r","\n"),'', htmlspecialchars_decode(urldecode(trim(preg_replace('#((^|\s)(href|src))=\s*[\"\']?)/#i','', html_entity_decode(trim(preg_replace('#((^|\s)(href|src))=\s*[\"\']?)/#i','', trim(html_entity_decode(urldecode(trim(preg_replace('#((^|\s)(href|src))=\s*[\"\']?)/#i','', html_entity_decode(trim(preg_replace('#((^|\s)(href|src))=\s*[\"\']?)/#i','', trim(strip_tags(str_replace(array("\r\n","\r","\n"),'', htmlspecialchars_decode(urldecode(trim(preg_replace('#((^|\s)(href|src))=\s*[\"\']?)/#i','', html_entity_decode(trim(preg_replace('#((^|\s)(href|src))=\s*[\"\']?)/#i','', html_entity_decode(trim(preg_replace('#((^|\s)(href|src))=\s*[\"\']?)/#i','', trim(html_entity_decode(urldecode(trim(htmlspecialchars_decode(urldecode(trim(preg_replace('#((^|\s)(href|src))=\s*[\"\']?)/#i','', html_entity_decode(trim(strip_tags(str_replace(array("\r\n","\r","\n"),'', htmlspecialchars_decode(urldecode(trim(preg_replace('#((^|\s)(href|src))=\s*[\"\']?)/#i','', html_entity_decode(trim(preg_replace('#((^|\s)(href|src))=\s*[\"\']?)/#i','', trim(html_entity_decode(urldecode(trim(preg_replace('#((^|\s)(href|src))=\s*[\"\']?)/#i','', html_entity_decode(trim(strip_tags(str_replace(array("\r\n","\r","\n"),'', htmlspecialchars_decode(urldecode(trim(preg_replace('#((^|\s)(href|src))=\s*[\"\']?)/#i','', html_entity_decode(trim(strip_tags(str_replace(array("\r\n","\r","\n"),'', htmlspecialchars_decode(urldecode(trim(preg_replace('#((^|\s)(href|src))=\s*[\"\']?)/#i','', html_entity_decode(trim(strip_tags(str_replace(array("\r\n","\r","\n"),'', htmlspecialchars_decode(urldecode(trim(preg_replace('#((^|\s)(href|src))=\s*[\"\']?)/#i','', html_entity_decode(trim(preg_replace('#((^|\s)(href|src))=\s*[\"\']?)/#i','', trim(strip_tags(str_replace(array("\r\n","\r","\n"),'', htmlspecialchars_decode(urldecode(trim(preg_replace('#((^|\s)(href|src))=\s*[\"\']?)/#i','', html_entity_decode(trim(strip_tags(str_replace(array("\r\n","\r","\n"),'', htmlspecialchars_decode(urldecode(trim(preg_replace('#((^|\s)(href|src))=\s*[\"\']?)/#i','', html_entity_decode(trim(strip_tags(str_replace(array("\r\n","\r","\n"),'', htmlspecialchars_decode(urldecode(trim(preg_replace('#((^|\s)(href|src))=\s*[\"\']?)/#i','', html_entity_decode(strtolower(substr(ltrim(htmlspecialchars_decode(strtolower(substr(ltrim(htmlspecialchars_decode(strtolower(substr(ltrim(htmlspecialchars_decode(strtolower(substr(ltrim(htmlspecialchars_decode(strtolower(substr(ltrim(htmlspecialchars_decode(strtolower(substr(ltrim(htmlspecialchars_decode(strtolower(substr(ltrim(htmlspecialchars_decode(strtolower(substr(ltrim(htmlspecialchars_decode(strtolower(substr(ltrim(htmlspecialchars_decodetrim(strip_tags(str_ireplace('"','',$match[1])))))))))))))))))))))))))))))))))))))))))))))), ENT_QUOTES),"UTF-8")), ENT_QUOTES),"UTF-8")), ENT_QUOTES),"UTF-8")), ENT_QUOTES),"UTF-8")), ENT_QUOTES),"UTF-8")), ENT_QUOTES),"UTF-8")), ENT_QUOTES),"UTF-8")), ENT_QUOTES),"UTF-8")), ENT_QUOTES),"UTF-8")), ENT_QUOTES),"UTF-8")), ENT_QUOTES),"UTF-8")))))))))))))), ENT_QUOTES),"UTF-8"))))), ENT_QUOTES),"UTF-8"))))), ENT_QUOTES),"UTF-8"))))), ENT_QUOTES),"UTF-8")))))));

   if (filter_var($match[1], FILTER_VALIDATE_URL)!== false){

   //过滤掉跳转链接(可选)

   if (stripos($url,'rel=')===false || stripos($url,'nofollow')===false){

   //$results[]= trim(strip_tags(str_ireplace('</strong>','</strong>', str_ireplace('','</p>'."\n\n".'

  ', str_ireplace('',''."\n".'<p>', strip_tags(str_ireplace('<br />','<br />',str_ireplace('

','

',str_ireplace('

','

',str_ireplace('<BR/>','<BR/>',str_ireplace('<BR>','<BR>',str_ireplace('&nbsp;','',strip_tags(br2nl(br2nl(br2nl(br2nl(br2nl(br2nl(br2nl(br2nl(br2nl(br2nl(br2nl(stripslashes(stripslashes(stripslashes(stripslashes(stripslashes(stripslashes(stripslashes(stripslashes(stripslashes(stripslashes(stripslashes(stripslashes(stripslashes(stripslashes(stripcslashes(stripcslashes(stripc。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线