新概念二册复习(26-40)

原来的0基础链接失效,自己又找到了个很不错的地方学。

http://st.hujiang.com/mag/135852085/up/p4/

里面需要登录回复才能看到部分隐藏内容。所以我这边每次复习完一课,就将笔记占贴到下一课~

家里装修了3个月。。。终于快好了。。。

建筑工真的很辛苦,当年差些些就跑去做这行了。并不是轻视这行,是各行有各行的生活方式。每星期回家都做小工,真心累。星期一到星期五感觉和放假一样。老妈很辛苦。体力活,在普通情况下,拿得比脑力活多,还真不能算多。体力活,你在做什么,别人都看在眼里,不能停,能休息,但是不能太多,让人感觉你在偷懒。环境不是很好的,像家里贴瓷砖,墙壁白花需要用斧头一点点刨。怎么说呢,斧头6~7把。用砂轮片磨,光来磨的砂轮片就磨坏了两个。斧头6~7把,每天都得磨,轮着。专门搞这个的小哥,手臂一只大一只小,比例差了3~4分之一。。。。。看他搞高的太麻烦,送了他副泳镜。每天中午和晚上我都得洗一次。鼻子里的都是小沙尘,一块一块的。隔天喉咙就不舒服,戴面罩也一样。

各种折腾就不吐槽了,好好利用自己的空闲时间,努力提升自己~

preg_replace return NULL 解决

本来以为自己对正则已经很熟悉,最近又学到了一个,虽然是配置上的问题,不过也学习了。
使用preg_replace 处理长字符串时,返回null的原因

http://de.php.net/manual/de/pcre.configuration.php

官方文档

这些函数的行为受 php.ini 中的设置影响。

PCRE配置选项
名字	默认	可修改范围	更新日志
pcre.backtrack_limit	"100000"	PHP_INI_ALL	php 5.2.0可用.
pcre.

 

"100000" PHP_INI_ALL php 5.2.0可用. 有关 PHP_INI_* 样式的更多详情与定义,见 配置可被设定范围。 这是配置指令的简短说明。 pcre.backtrack_limit integer PCRE的回溯限制. pcre.recursion_limit integer PCRE的递归限制. 请注意, 如果 讲这个值设置为一个很大的数字, 你可能会消耗掉 所有的进程可用堆栈, 最终导致php崩溃(直到达到系统限制的堆栈大小).

由于在匹配到前,内容太多,回溯和匹配过多,导致NULL

所以只要

ini_set('pcre.backtrack_limit',1000000);
ini_set('pcre.recursion_limit',1000000);
//通常够用,不沟通,适当加大即可。

phpjquery & simpledomphp 比较

phpjquery

https://github.com/TobiaszCudnik/phpquery

simplehtmldom

http://simplehtmldom.sourceforge.net/

<?php

function gddebug() {
	$arrays = func_get_args ();
	echo "n<pre>";
	foreach ( $arrays as $value ) {
		echo "==============================================rn";
		if (is_array ( $value ) || is_object ( $value )) {
			ksort ( $value );
			echo htmlspecialchars ( print_r ( $value, true ) ) . "rn";
		} elseif (is_string ( $value )) {
			echo "string(" . strlen ( $value ) . ") "" . htmlspecialchars ( $value ) . ""rn";
		} else {
			var_dump ( $value );
		}
	}
	echo "</pre>";
}
gddebug ( 'init', memory_get_usage () );
require ('phpQuery/phpQuery.php');
gddebug ( 'load libs', memory_get_usage () );

// INITIALIZE IT
// phpQuery::newDocumentHTML($markup);
// phpQuery::newDocumentXML();
// phpQuery::newDocumentFileXHTML('test.html');
// phpQuery::newDocumentFilePHP('test.php');
// phpQuery::newDocument('test.xml', 'application/rss+xml');
// this one defaults to text/html in utf8
// 文件 内容
// //https://www.google.com.sg/search?hl=zh-CN&site=imghp&tbm=isch&source=hp&biw=1366&bih=653&q=271072+CC240+armani&oq=271072+CC240+armani&gs_l=img.12...5739.5739.0.6570.1.1.0.0.0.0.120.120.0j1.1.0....0...1ac..64.img..1.0.0.Md5Dux9zIdI
$doc = phpQuery::newDocumentFileHTML ( 'test.html' );

gddebug ( 'load file', memory_get_usage () );
$obj = $doc->find ( '.rg_di' );
gddebug ( 'load elements', memory_get_usage (), 'count', count ( $obj ) );

输出

==============================================
string(4) "init"
==============================================
int(62208)
==============================================
string(9) "load libs"
==============================================
int(1441040)
==============================================
string(9) "load file"
==============================================
int(1445448)
==============================================
string(13) "load elements"
==============================================
int(1469744)
==============================================
string(5) "count"
==============================================
int(100)

===========================simple html dom

<?php

function gddebug() {
	$arrays = func_get_args ();
	echo "n<pre>";
	foreach ( $arrays as $value ) {
		echo "==============================================rn";
		if (is_array ( $value ) || is_object ( $value )) {
			ksort ( $value );
			echo htmlspecialchars ( print_r ( $value, true ) ) . "rn";
		} elseif (is_string ( $value )) {
			echo "string(" . strlen ( $value ) . ") "" . htmlspecialchars ( $value ) . ""rn";
		} else {
			var_dump ( $value );
		}
	}
	echo "</pre>";
}
gddebug ( 'init', memory_get_usage () );
include 'simple_html_dom.php';
gddebug ( 'load libs', memory_get_usage () );

// INITIALIZE IT
// phpQuery::newDocumentHTML($markup);
// phpQuery::newDocumentXML();
// phpQuery::newDocumentFileXHTML('test.html');
// phpQuery::newDocumentFilePHP('test.php');
// phpQuery::newDocument('test.xml', 'application/rss+xml');
// this one defaults to text/html in utf8

// //https://www.google.com.sg/search?hl=zh-CN&site=imghp&tbm=isch&source=hp&biw=1366&bih=653&q=271072+CC240+armani&oq=271072+CC240+armani&gs_l=img.12...5739.5739.0.6570.1.1.0.0.0.0.120.120.0j1.1.0....0...1ac..64.img..1.0.0.Md5Dux9
$doc = file_get_html ( 'test.html' );

gddebug ( 'load file', memory_get_usage () );
$obj = $doc->find ( '.rg_di' );
gddebug ( 'load elements', memory_get_usage (), 'count', count ( $obj ) );

 

==============================================
string(4) "init"
==============================================
int(62072)
==============================================
string(9) "load libs"
==============================================
int(527136)
==============================================
string(9) "load file"
==============================================
int(5590512)
==============================================
string(13) "load elements"
==============================================
int(5596016)
==============================================
string(5) "count"
==============================================
int(100)

不用多言,内存使用上完败。。

还只是一个小页面,大页面,基本上simplehtmldom经常性抛出内存不足,需要很很好的进行clear()和unset 来释放内存。同时在解析目标元素时,需要通过正则将目标元素前后元素删除才不会占用过多内存。使用上,phpjquery更接近jquery,个人比较喜欢这类。

本来最近频繁帮朋友采集各种在线商店的商品数据,嫌simple太繁琐,准备自己写个脚本,分离出需要保留的元素来的(包含子节点)。后续研究下phpjquery有没有类似的,没有就自己写一个出来,先占位~