邢栋博客
邢栋博客,Action博客,记录工作和生活中的点点滴滴
python的beautifulsoup4简单测试
# -*- coding:utf8 -*- # 测试基于 python2.7 # 安装pip 如果没有安装的话 # sudo easy_install pip # 安装 beautifulsoup4 # pip install beautifulsoup4 from bs4 import BeautifulSoup import re html_doc = """ <html><head><title>The Dormouse's story</title></head> <body> <p class="title"><b>The Dormouse's story</b></p> <p class="story">Once upon a time there were three little sisters; and their names were <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>, <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>; and they lived at the bottom of a well.</p> <p class="story">...</p> """ soup = BeautifulSoup(html_doc,'html.parser',from_encoding='utf-8') print '获取所有的链接' links = soup.find_all('a') for link in links: print link.name,link['href'],link.get_text() print '获取Lacie的链接' link_node = soup.find('a',href='http://example.com/lacie') print link_node.name,link_node['href'],link_node.get_text() print '正则匹配' link_node = soup.find('a',href=re.compile(r"ill")) print link_node.name,link_node['href'],link_node.get_text() print '获取p段落文字' p_node = soup.find('p',class_="title") print p_node.name,p_node.get_text()
php运行机制和原理
标签:
php
php由内核Zend引擎和扩展成组成,php内核负责处理请求、完成文件流错误处理等操作,Zend引擎可以将php程序文件转换成可以在虚拟机上运行的机器语言,扩展层提供一些应用层操作需要的函数类库等,比如数组和mysql数据库的操作等。
Zend引擎是用C语言实现的,将php代码通过词法语法解析成可执行的Opcode并实现相应的处理方法和基本的数据结构进行内存分配和管理等,对外提供相应的可供调用的API方法。Zend引擎是php的核心,所有的外围功能都是围绕他实现的。扩展层通过组件的方式提供各种基础服务、内置函数,标准库都是通过它来实现的。用户也可以编写自己的扩展来实现特定的需求。服务端应用编写接口(Server Application Programming Interface,SAPI),通过一系列钩子函数使得php可以和外围交互数据。我们平时编写的php程序就是通过不同的SAPI方式得到不同的应用模式,如通过WebServer实现的Web应用和在命令行下运行的脚本等。
一段php程序被执行的时候会被解析成opcode命令,然后在虚拟机中按照顺序执行,由于php本身是C语言开发的,所以在执行的时候调用的都是C的函数。Opcode是php程序执行的基本单位。
某公司给的测试题目201708018
标签:
php
演员的技能用字母A-Z表示,某活动需要演员按顺序完成任务,完成得最多的,可获得奖励。由于演员多才多艺,提前告知任务顺序,很容易完成任务。现在让演员随意表演,最后公布活动任务最长匹配度。如一个演员表演顺序 ABCBDAB,最后活动顺序为BDCABA,那么最大匹配度值为4(匹配值为BCBA或者BDAB)。现在编写程序实现以上功能:
<?php $a = 'ABCBDAB'; $b = 'BDCABA'; $aStrlen = strlen($a); $bStrlen = strlen($b); $maxCount = 0; for ($i=0; $i < $aStrlen; $i++) { $ch = $a[$i]; $aIdx = $i; $bIdx = 0; $count = 0; $next = false; for ($j=$bIdx;$j<$bStrlen; $j++) { if($ch == $b[$j]){ $count++; $bIdx = $j; $next = true; } if($j == $bStrlen-1 && $count != 0 && $aIdx < $aStrlen){ $j = $bIdx; $next = true; } if($next){ if(++$aIdx == $aStrlen){ break; } $next = false; $ch = $a[$aIdx]; } } if($count > $maxCount){ $maxCount = $count; } //假如最大次数大于剩余要比较的字符串,则break if($maxCount >= $aStrlen-$i){ break; } } echo $maxCount;
php利用二叉堆算法来实现 TopK
利用二叉堆算法来实现 TopK
实现流程是:
1、先读取10个或100个数到数组里面,这就是我们的topK数.
2、调用生成小顶堆函数,把这个数组生成一个小顶堆结构,这个时候堆顶一定是最小的.
3、从文件或者数组依次遍历剩余的所有数.
4、每遍历出来一个则跟堆顶的元素进行大小比较,如果小于堆顶元素则抛弃,如果大于堆顶元素则替换之.
5、跟堆顶元素替换完毕之后,在调用生成小顶堆函数继续生成小顶堆,因为需要再找出来一个最小的.
6、重复以上4~5步骤,这样当全部遍历完毕之后,我们这个小顶堆里面的就是最大的topK,因为我们的小顶堆永远都是排除最小的留下最大的,而且这个调整小顶堆速度也很快,只是相对调整下,只要保证根节点小于左右节点就可以.
7、算法复杂度的话按top10最坏的情况下,就是每遍历一个数,如果跟堆顶进行替换,需要调整10次的情况,也要比排序速度快,而且也不是把所有的内容全部读入内存,可以理解成就是一次线性遍历.
<?php //为了测试运行内存调大一点 ini_set('memory_limit', '2024M'); //生成小顶堆函数 function Heap(&$arr,$idx){ $left = ($idx << 1) + 1; $right = ($idx << 1) + 2; if (!isset($arr[$left])){ return; } if(isset($arr[$right]) && $arr[$right] < $arr[$left]){ $l = $right; }else{ $l = $left; } if ($arr[$idx] > $arr[$l]){ $tmp = $arr[$idx]; $arr[$idx] = $arr[$l]; $arr[$l] = $tmp; Heap($arr,$l); } } /* 当然这个数据集并不一定全放在内存,也可以在 文件里面,因为我们并不是全部加载到内存去进 行排序 */ for($i=0;$i<500000;$i++){ $numArr[] = $i; } //打乱它们 shuffle($numArr); //先取出10个到数组 $topArr = array_slice($numArr,0,10); //获取最后一个有子节点的索引位置 //因为在构造小顶堆的时候是从最后一个有左或右节点的位置 //开始从下往上不断的进行移动构造(具体可看上面的图去理解) $idx = floor(count($topArr) / 2) - 1; //生成小顶堆 for($i=$idx;$i>=0;$i--){ Heap($topArr,$i); } echo time()."<hr/>"; //这里可以看到,就是开始遍历剩下的所有元素 for($i = count($topArr); $i < count($numArr); $i++){ //每遍历一个则跟堆顶元素进行比较大小 if ($numArr[$i] > $topArr[0]){ //如果大于堆顶元素则替换 $topArr[0] = $numArr[$i]; /* 重新调用生成小顶堆函数进行维护,只不过这次是从堆顶 的索引位置开始自上往下进行维护,因为我们只是把堆顶 的元素给替换掉了而其余的还是按照根节点小于左右节点 的顺序摆放这也就是我们上面说的,只是相对调整下,并 不是全部调整一遍 */ Heap($topArr,0); } } echo "<hr/>"; var_dump($topArr); echo "<hr/>".time()."<hr>";
源文链接:简书 http://www.jianshu.com/p/df71c71cdc57
php使用openssl_random_pseudo_bytes生成安全的随机数
需要安装openssl扩展,openssl_random_pseudo_bytes
function getRandomString($length = 6) { /* * Use OpenSSL (if available) */ if (function_exists('openssl_random_pseudo_bytes')) { $bytes = openssl_random_pseudo_bytes($length * 2); if ($bytes === false) throw new RuntimeException('Unable to generate a random string'); return substr(str_replace(['/', '+', '='], '', base64_encode($bytes)), 0, $length); } $pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; return substr(str_shuffle(str_repeat($pool, 5)), 0, $length); }
php发送与接收流文件方法
<?php /** php 发送流文件 * @param String $url 接收的路径 * @param String $file 要发送的文件 * @return boolean */ function sendStreamFile($url, $file){ if(file_exists($file)){ $opts = array( 'http' => array( 'method' => 'POST', 'header' => 'content-type:application/x-www-form-urlencoded', 'content' => file_get_contents($file) ) ); $context = stream_context_create($opts); $response = file_get_contents($url, false, $context); $ret = json_decode($response, true); return $ret['success']; }else{ return false; } } $ret = sendStreamFile('http://localhost/receiveStreamFile.php', 'send.txt'); var_dump($ret); /** php 接收流文件 * @param String $file 接收后保存的文件名 * @return boolean */ function receiveStreamFile($receiveFile){ $streamData = file_get_contents('php://input'); if($streamData!=''){ $ret = file_put_contents($receiveFile, $streamData, true); }else{ $ret = false; } return $ret; } $receiveFile = 'receive.txt'; $ret = receiveStreamFile($receiveFile); echo json_encode(array('success'=>(bool)$ret)); ?>
关于php类的析构函数
<?php class A { public $name = 'xd'; function __construct($test='test'){ echo 'construct->'.$test.'<br>'; } function __destruct(){ echo 'destruct->'.$this->name.'<br>'; } } $a = new A('a'); $a = null; $b = new A('b'); echo 'helloxd'; ?>
<!--
上面的结果是:construct->a
destruct->xd
construct->b
111destruct->xd
如果把$a = null;去掉
则
construct->a
construct->b
111 destruct->xd
destruct->xd
ps:析构函数会在程序执行完毕之后进行调用,如果把new类的变量设置为null(重新赋值一样),可以触发析构函数的调用
-->
php获取和处理url常用方法
<?php
//当前页面 http://localhost/ceshi/url.php?id=365
//获取域名或主机地址
echo $_SERVER['HTTP_HOST']; //localhost
echo "<br>";
//获取当前页面url
echo $_SERVER['PHP_SELF']; // /ceshi/url.php,如果url为url.php/index/index,则输出/ceshi/url.php/index/index
echo "<br>";
//获取当前页面参数
echo $_SERVER["QUERY_STRING"];//id=365
echo "<br>";
//获取端口
echo $_SERVER["SERVER_PORT"];//80
echo "<br>";
//完成的url
$url = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?'.$_SERVER["QUERY_STRING"];
echo $url;
echo "<br>";
echo "<pre>";
print_r(pathinfo($url)); //返回文件路径的信息
/*结果 Array
(
[dirname] => http://localhost//ceshi
[basename] => url.php?id=365
[extension] => php?id=365
[filename] => url
)*/
print_r(parse_url($url)); //解析 URL,返回其组成部分
/*结果Array
(
[scheme] => http
[host] => localhost
[path] => //ceshi/url.php
[query] => id=365
)
*/
print_r(basename($url)); // 返回路径中的文件名部分 结果url.php?id=365
echo "<br>";
print_r(dirname($url)); //返回路径中的目录部分 结果 http://localhost/ceshi
//当前页面 http://localhost/ceshi/url.php?id=365
//获取域名或主机地址
echo $_SERVER['HTTP_HOST']; //localhost
echo "<br>";
//获取当前页面url
echo $_SERVER['PHP_SELF']; // /ceshi/url.php,如果url为url.php/index/index,则输出/ceshi/url.php/index/index
echo "<br>";
//获取当前页面参数
echo $_SERVER["QUERY_STRING"];//id=365
echo "<br>";
//获取端口
echo $_SERVER["SERVER_PORT"];//80
echo "<br>";
//完成的url
$url = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?'.$_SERVER["QUERY_STRING"];
echo $url;
echo "<br>";
echo "<pre>";
print_r(pathinfo($url)); //返回文件路径的信息
/*结果 Array
(
[dirname] => http://localhost//ceshi
[basename] => url.php?id=365
[extension] => php?id=365
[filename] => url
)*/
print_r(parse_url($url)); //解析 URL,返回其组成部分
/*结果Array
(
[scheme] => http
[host] => localhost
[path] => //ceshi/url.php
[query] => id=365
)
*/
print_r(basename($url)); // 返回路径中的文件名部分 结果url.php?id=365
echo "<br>";
print_r(dirname($url)); //返回路径中的目录部分 结果 http://localhost/ceshi