<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>程默的博客 &#187; 学习心得</title>
	<atom:link href="http://blog.chacuo.net/category/learning/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.chacuo.net</link>
	<description>web原理、web架构、web安全、web性能、服务器性能、服务器架构、服务器安全;你不能预知明天，但你可以利用今天。你不能样样顺利，但你可以事事尽力!</description>
	<lastBuildDate>Mon, 31 Aug 2020 15:33:40 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>web开发人员 提升技术、突破瓶颈方法探讨</title>
		<link>http://blog.chacuo.net/293.html</link>
		<comments>http://blog.chacuo.net/293.html#comments</comments>
		<pubDate>Tue, 18 Jun 2013 15:18:00 +0000</pubDate>
		<dc:creator>程默</dc:creator>
				<category><![CDATA[学习心得]]></category>
		<category><![CDATA[突破技术瓶颈]]></category>

		<guid isPermaLink="false">http://blog.chacuo.net/?p=293</guid>
		<description><![CDATA[技术瓶颈表现 作为一名web技术开发人员，也是我们说的IT人员。 刚刚入门时候，会发现有很强的兴趣。天天会遇到 [...]]]></description>
				<content:encoded><![CDATA[<p><strong>技术瓶颈表现</strong></p>
<p>作为一名web技术开发人员，也是我们说的IT人员。 刚刚入门时候，会发现有很强的兴趣。天天会遇到新的事情，可以不断做一些新的功能。到后来，会发现。自己所做的工作，技术点都差不多，然后感觉学习东西越来越少。最后，也慢慢对该行业兴趣不强烈了。 而后，慢慢有些油了。 总是感觉学习知识是在炒旧饭，很久也没有感觉到自己的提升。 这个时候，也就是我们经常说的技术瓶颈。</p>
<p><strong>怎么样突破技术瓶颈</strong></p>
<p>我们知道，行行出状元。并且能熟能生巧，那么我们做技术是不是做的多，也自然而然会成为状元，会生巧呢？ 确实，作为web技术人员，做得多，对自己编码速度，处理问题提升会很多。 但是，却又不完全成正比。我们发现很多时候，看似我们做系统技术点工作，但是很少有相同产品。只是技术实现类似而已！作为技术人员，我想主要提升方面是：<u><font color="#9b00d3">技术广度、另外是技术深度</font></u></p>
<p><font color="#000000">技术广度，可以从web人员，学习技能入手。可以看看，前面一篇文章：</font><a title="web开发人员技能点" href="http://blog.chacuo.net/280.html" rel="web开发人员技能点">web前端开发人员技能点汇总、技术详细列表</a>&#160; ，这一般很容易理解，也很容易学习到。基本上是这些功能点而已。 但是，另外技术深度，就很难把握！它像水面有张力一样，一般很难沉下去。这里，我们可以想象下，为什么会这样。</p>
<p>技术深度非常重要。作为一名web开发人员，很多都是通过培训，或者自己感兴趣，然后看看书，去模仿模仿，有人指导下。 然后就是一名web人员了。 但是，所有经验大多数来自实际总结，但是，实际我们缺少了，web开发原理东西。这方面一般很少有朋友喜欢整本整本书看。一般习惯网上看看，别人分享经验技巧。这样一来，对学习只是也是很零碎的。这些都是导致想深入学习的原因。</p>
<p>要深入，我们必须对一个问题，首先是了解它是什么，然后是怎么样使用，最后是为什么它会达到这样结果。也就是我们常说的，刨根问底！很多时候，web人员，喜欢”功能开发完了，就OK了”， 也不会去寻找该功能实现本质，有没有其它更好方法。这样，你将始终停留在使用功能。不停重复使用相同功能。 其实，有人说要做好一名技术人员，必须<font color="#9b00d3"><u>有所追求 </u>，</font><font color="#000000">其实就是需要有刨根问底的精神。要能每次做同一个事情，都有新要求。我的代码结构，性能、安全、扩展性等方面。是不是提升了。这些都可以是具体提升的一些方面。</font></p>
<p>因此，要提升自己技术深度方法。就是，每次再实现一个方法方面，有所创新，有所改进。无论是结构，还是性能，还是安全，还是其它等等方面。你会发现，在改造同时，自己对该项知识掌握就自然深入了。 越来越了解该项技能本质了。 做一个有技术追求的人，是能很好的提升自己的广度、深度的！</p>
<p>好了，以上是我对技术成长方面，广度、深度理解。欢迎朋友有不同方法，可以给予建议！</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chacuo.net/293.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>web前端开发人员技能点汇总、技术详细列表</title>
		<link>http://blog.chacuo.net/280.html</link>
		<comments>http://blog.chacuo.net/280.html#comments</comments>
		<pubDate>Sun, 16 Jun 2013 15:16:41 +0000</pubDate>
		<dc:creator>程默</dc:creator>
				<category><![CDATA[学习心得]]></category>
		<category><![CDATA[前端开发技能点]]></category>

		<guid isPermaLink="false">http://blog.chacuo.net/?p=280</guid>
		<description><![CDATA[常常做了一段时间的web开发，然后就慢慢迷失了方向。感觉自己的技术到一个瓶颈，不知道下一步该要学习哪些知识。常 [...]]]></description>
				<content:encoded><![CDATA[<p>常常做了一段时间的web开发，然后就慢慢迷失了方向。感觉自己的技术到一个瓶颈，不知道下一步该要学习哪些知识。常常这个时候，很多人因为瓶颈，导致一直原地踏步！也有写朋友，感觉自己什么都可以了。 记得，我当时刚做1年多网站时候。就有那个感觉，觉得自己什么都可以做了。什么留言板、用户系统、论坛、产品管理等，然后去一家大一点的公司谋职，被一个招聘人员问了几个问题。然后，觉得自己非常自信，回答非常好！但是结果音信全无，指导后来过来几年后，对当时那段时间回忆起来，觉得自己当时勇气可嘉！</p>
<p>下面，这个图，是作为web开发人员，技能知识点汇总。里面常常包括，ui人员、js人员、web编码人员的所有知识点。但是，这3者之间开发中联系密切。彼此之间多了解下，很有必要的！</p>
<blockquote><pre><a href="http://blog.chacuo.net/wp-content/uploads/2013/06/fks.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px 0px 0px 10px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="web开发人员技能知识点汇总" border="0" alt="web开发人员技能知识点汇总" src="http://blog.chacuo.net/wp-content/uploads/2013/06/fks_thumb.jpg" width="922" height="836"></a></pre>
<pre>本图来源于开源项目：<a href="https://github.com/jacksontian/fks">https://github.com/jacksontian/fks</a>  里面有详细学习资料介绍，大家可以去了解下！</pre>
<pre>&nbsp;</pre>
</blockquote>
<p>从这个图里面，几乎包含了ui,js,web程序开发。这3个方面，无论那个方面人员，我觉得都有必要可以多了解下这些技能点。多了解些技能点，彼此直接沟通会更方便！也将容易得多了。我想，如果很早那年我有看过这个图，我就知道自己有几斤几两啦！（当然，比较早时候，很多知识那个时候还没有出现。不过也至少有这个图里面一半左右知识技能点）</p>
<p><strong>web开发人员技能提升提现</strong></p>
<p>也就是说，怎么样说明自己在进步了，自己确实提高了。我认为有2点重要，上面这个图说的是需要<strong><u>掌握的技能点的广度 ,</u></strong>另外一点就是：<strong><u>掌握技能点的深度 </u></strong>。估计这个时候，我们脑子里面就会想，广度很好理解好验证的。那么深度指的是什么呢，我自己到底掌握到那个深度了呢？下次，我会继续补充！欢迎交流！</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chacuo.net/280.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>正则表达式断言、巡视（Assertions）、正向断言、反向断言</title>
		<link>http://blog.chacuo.net/262.html</link>
		<comments>http://blog.chacuo.net/262.html#comments</comments>
		<pubDate>Fri, 14 Jun 2013 15:50:00 +0000</pubDate>
		<dc:creator>程默</dc:creator>
				<category><![CDATA[web原理]]></category>
		<category><![CDATA[学习心得]]></category>
		<category><![CDATA[正则表达式]]></category>

		<guid isPermaLink="false">http://blog.chacuo.net/?p=262</guid>
		<description><![CDATA[断言（Assertions）在正则表达式概念里面难理解，它通常指的是在目标字符串的当前匹配位置进行的一种测试但 [...]]]></description>
				<content:encoded><![CDATA[<p>断言（Assertions）在正则表达式概念里面难理解，它通常指的是在目标字符串的当前匹配位置进行的一种测试但这种测试并不占用目标字符串，也即不会移动模式在目标字符串中的当前匹配位置。详细可以看看,<a title="正则表达式匹配过程" href="http://blog.chacuo.net/255.html" rel="正则表达式匹配过程" target="_blank">正则表达式匹配解析过程探讨分析（正则表达式匹配原理）</a>，里面提到“<strong>零宽度</strong>“很多元字符，只是对特殊位置进行匹配，它们可以理解为断言。</p>
<p><strong>断言元字符</strong></p>
<p>常见断言元字符有：&nbsp; \b, \B, \A, \Z, \z, ^ ,$ 它们只是表示特殊位置，各自作用如有字符串AB,带位置表示为：<sub>0</sub>A<sub>1</sub>B<sub>2</sub></p>
<blockquote><table class="table" border="1" rules="all" cellspacing="0" width="935" frame="box">
<thead>
<tr valign="top">
<th width="316">元字符</th>
<th width="617">意义(以上面带位置字符串说明)</th>
</tr>
</thead>
<tbody>
<tr>
<td valign="top" width="316"><strong>^</strong></td>
<td valign="top" width="617">行首，字符串首 表示位置0</td>
</tr>
<tr>
<td valign="top" width="316"><strong>$</strong></td>
<td valign="top" width="617">行尾，字符串尾部，表示位置2</td>
</tr>
<tr>
<td valign="top" width="316">\b</td>
<td valign="top" width="617">字分界线，可以表示：0,2位置</td>
</tr>
<tr>
<td valign="top" width="316">\B</td>
<td valign="top" width="617">非字分界线，可以表示1位置</td>
</tr>
<tr>
<td valign="top" width="316">\A</td>
<td valign="top" width="617">目标的开头（独立于多行模式） 表示位置0</td>
</tr>
<tr>
<td valign="top" width="316">\Z</td>
<td valign="top" width="617">目标的结尾或位于结尾的换行符前（独立于多行模式） 表示位置2</td>
</tr>
<tr>
<td valign="top" width="316">\z</td>
<td valign="top" width="617">目标的结尾（独立于多行模式）表示位置2</td>
</tr>
<tr>
<td valign="top" width="316">\G</td>
<td valign="top" width="617">目标中的第一个匹配位置</td>
</tr>
<tr>
<td valign="top" colspan="2">A,Z,z,G很少使用</td>
</tr>
</tbody>
</table>
</blockquote>
<p>这些断言的测试都是一些基于当前位置的测试，断言还支持更多复杂的测试条件。更复杂的断言以子模式方式来表示，它包括先行（前向)断言(Lookahead assertions)和后行（后向）断言(Lookbehind assertions)，这些断言判断只做匹配判断条件，不会记录在匹配结果中，不会匹配字符。</p>
<p><strong>先行断言、正向断言、正向巡视（Lookahead assertions）</strong></p>
<p>先行断言，常有表示（?=pattern)，从当前匹配位置开始测试后面匹配字符串是否成立，还有(?!pattern)这样两种格式，我们来看看一个例子。源字符串：“abc100”，正则表达式是：<br />/[a-z]+(?=\d+)/ ，我们分析下过程如下图：</p>
<blockquote><pre><a href="http://blog.chacuo.net/wp-content/uploads/2013/06/image31.png"><img style="background-image: none; border-right-width: 0px; margin: 0px 0px 0px 10px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="正则表达式先行断言、正向断言、正向巡视" border="0" alt="正则表达式先行断言、正向断言、正向巡视" src="http://blog.chacuo.net/wp-content/uploads/2013/06/image_thumb31.png" width="842" height="364"></a></pre>
</blockquote>
<p>首先由正则表达式字符 [a-z]+ 取得控制权,匹配字符：”abc”，位置从”0”开始匹配，变成3。从该位置测试/d+是否成立。匹配到字符100，返回成立。因此正则表达式正向断言成功。返回匹配字符串”abc”</p>
<p>(?!pattern) 只是，正向匹配，当后面没有匹配成功，将返回真。以下是系统源字符串：abc100，测试结果如下：</p>
<blockquote><pre><a href="http://blog.chacuo.net/wp-content/uploads/2013/06/image32.png"><img style="background-image: none; border-right-width: 0px; margin: 0px 0px 0px 10px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="正则表达式先行断言、正向断言、正向巡视" border="0" alt="正则表达式先行断言、正向断言、正向巡视" src="http://blog.chacuo.net/wp-content/uploads/2013/06/image_thumb32.png" width="845" height="330"></a></pre>
<p>&nbsp;</p>
<pre></pre>
</blockquote>
<p><strong>后行断言、反向断言、反向巡视（Lookbehind assertions）</strong></p>
<p>后行断言，常见表达式是：(?&lt;=pattern)或者(?&lt;!pattern)格式。正则表达式里面，不要出现不固定长度量词，可能会出现死循环。匹配出错。表示当前位置左边将出现匹配字符，则返回真，后面匹配正常。因为如果它出现在最左边，默认位置从0开始，匹配都是失败的。一般都从后面正则表达式开始匹配，再回溯，直到匹配到为止。我们看看下面例子：源字符串：“abc100+=“，正则表达式是：”(?&lt;=\w)\w+”，匹配过程如下图：</p>
<blockquote><pre><a href="http://blog.chacuo.net/wp-content/uploads/2013/06/image33.png"><img style="background-image: none; border-right-width: 0px; margin: 0px 0px 0px 10px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="正则表达式后行断言、反向断言、反向巡视" border="0" alt="正则表达式后行断言、反向断言、反向巡视" src="http://blog.chacuo.net/wp-content/uploads/2013/06/image_thumb33.png" width="850" height="421"></a></pre>
<p>&nbsp;</p>
<pre></pre>
</blockquote>
<p>首先由正则表达式字符 /\w+/取得控制权,匹配字符：”abc100”，位置从”0”开始匹配，匹配到6个字符。从该位置0检测左变\w匹配失败。因此/\w+/从字符b开始匹配到”bc100”，测试它左侧有字符”a”，反向断言正确。因此匹配到字符串“bc100”,(?&lt;!pattern)，只是没有匹配成功返回真，其它都一样！</p>
<p><strong>后记：</strong>从这篇文章，我们发现搜索特点都是从左到有，一般正向断言放到，正则表达式后，反向断言放到匹配正则表达式前。但是，这里也可以放到前或后。这里就不再举例。欢迎交流讨论！</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chacuo.net/262.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>正则表达式(regex) 贪婪模式、懒惰模式使用</title>
		<link>http://blog.chacuo.net/211.html</link>
		<comments>http://blog.chacuo.net/211.html#comments</comments>
		<pubDate>Tue, 11 Jun 2013 14:26:02 +0000</pubDate>
		<dc:creator>程默</dc:creator>
				<category><![CDATA[学习心得]]></category>
		<category><![CDATA[正则表达式]]></category>

		<guid isPermaLink="false">http://blog.chacuo.net/?p=211</guid>
		<description><![CDATA[正则表达式贪婪匹配模式，对于初学者，往往也很容易出错。有时候需要匹配一个段代码内容，发现匹配与想要不一致。发现 [...]]]></description>
				<content:encoded><![CDATA[<p>正则表达式贪婪匹配模式，对于初学者，往往也很容易出错。有时候需要匹配一个段代码内容，发现匹配与想要不一致。发现原来，跟贪婪模式有关系。如下，我们看下例子：</p>
<ul>
<li>
<h3><font style="font-weight: bold">什么是贪婪模式</font></h3>
</li>
</ul>
<blockquote><p>字符串有: “&lt;h3&gt;abd&lt;/h3&gt;&lt;h3&gt;bcd&lt;/h3&gt;”，我们想匹配&lt;h3&gt;…&lt;/h3&gt;内容，正则表达式如下：</p>
<p>1、h3开头与结尾，”&lt;h3&gt;待添加&lt;/h3&gt;”&nbsp;&nbsp; &lt;h3&gt;&lt;/h3&gt;都作为普通字符</p>
<p>2、中间可以出现任意字符，个数可以是0个或者多个，正则表达式可以用：.* ，“.”代表任意字符，默认模式不匹配换行,”*” 重复前面字符0个或者多个。</p>
<p>3、最终我们考虑结果将是：”&lt;h3&gt;.*&lt;/h3&gt;” ，也可以是：”&lt;h3&gt;.{0,}&lt;/h3&gt;”&nbsp; ｛｝代表，重复前面指定个数字符，以下用到是，正则表达式调试工具截图，软件可以看：<a href="http://blog.chacuo.net/198.html">正则表达式工具推荐（学习工具、测试工具）</a></p>
<p><a href="http://blog.chacuo.net/wp-content/uploads/2013/06/image14.png"><img style="background-image: none; border-right-width: 0px; margin: 0px 0px 0px 10px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.chacuo.net/wp-content/uploads/2013/06/image_thumb14.png" width="821" height="450"></a></p>
<p><a href="http://blog.chacuo.net/wp-content/uploads/2013/06/image15.png"><img style="background-image: none; border-right-width: 0px; margin: 0px 0px 0px 10px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.chacuo.net/wp-content/uploads/2013/06/image_thumb15.png" width="817" height="384"></a></p>
<p>2种结果都一样，这是我们不希望得到的，我们希望从左边开始，第一个出现&lt;/h3&gt;，就开始匹配。以上这种模式，是贪婪模式，也是正则表达式默认以这个方法匹配。表示重复字符，操作符，默认都是贪婪模式，如：.*,.+,.{1,},.{0,} 都会匹配最大长度字符。<u><font color="#0000ff">正则表达式元字符，量词默认首先最大匹配字符串，这些量词有：+,*,?,{m,n} 。一开始匹配，就直接匹配到最长字符串。</font></u></p>
</blockquote>
<ul>
<li>
<h3><font style="font-weight: bold">什么是懒惰模式</font></h3>
</li>
</ul>
<h3><strong></strong></h3>
<p>既然上面几种，表示字符重复个数，元字符默认都是贪婪模式。如果，我们需要最小长度匹配，也就是懒惰模式，怎么样写正则表达式呢？其实，正则表达式里面通用方法是，在表示重复字符元字符，后面加多一个”?”字符即可。上面正则表达式可以写成：”&lt;h3&gt;.*?&lt;/h3&gt;”，或者”&lt;h3&gt;.{0,}?&lt;/h3&gt;” 都可以。</p>
<blockquote><p><a href="http://blog.chacuo.net/wp-content/uploads/2013/06/image16.png"><img style="background-image: none; border-right-width: 0px; margin: 0px 0px 0px 10px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.chacuo.net/wp-content/uploads/2013/06/image_thumb16.png" width="820" height="405"></a></p>
<p><a href="http://blog.chacuo.net/wp-content/uploads/2013/06/image17.png"><img style="background-image: none; border-right-width: 0px; margin: 0px 0px 0px 10px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.chacuo.net/wp-content/uploads/2013/06/image_thumb17.png" width="825" height="490"></a></p>
<p>懒惰模式，就匹配到我们需要字符串了。</p>
</blockquote>
<p><strong>总结：</strong>正则表达式，表示字符串重复个数元字符，’?,+,*,{}’ 默认都会选择贪婪模式，会最大长度匹配字符串，而要切换到懒惰模式，就只是在该元字符，后面加多一个”?” 即可切换到非贪婪模式（懒惰模式）。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chacuo.net/211.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>正则表达式（regex)入门、元字符(特殊字符)、学习提高、学习实例</title>
		<link>http://blog.chacuo.net/190.html</link>
		<comments>http://blog.chacuo.net/190.html#comments</comments>
		<pubDate>Mon, 10 Jun 2013 10:22:48 +0000</pubDate>
		<dc:creator>程默</dc:creator>
				<category><![CDATA[web原理]]></category>
		<category><![CDATA[学习心得]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[正则表达式]]></category>

		<guid isPermaLink="false">http://blog.chacuo.net/?p=190</guid>
		<description><![CDATA[什么是正则表达式呢？ 正则表达式，又称正规表示法、常规表示法（英语：Regular Expression，在代 [...]]]></description>
				<content:encoded><![CDATA[<ul>
<li>
<h3><font style="font-weight: bold">什么是正则表达式呢？</font></h3>
</li>
</ul>
<p>正则表达式，又称正规表示法、常规表示法（英语：Regular Expression，在代码中常简写为regex、regexp或RE），它是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。几乎在各种计算机编程语言中都有用到。可以分为普通正则表达式、扩展正则表达式、高级正则表达式。普通正则表达式在linux shell中常用到，高级正则表达式语法规范，基本由perl演化而来。目前常见程序语言（php,perl,python,java,c#)都支持高级正则表达式。</p>
<ul>
<li>
<h3><font style="font-weight: bold">我们为什么要学习正则表达式？</font></h3>
</li>
</ul>
<p>高级程序语言的正则表达式几乎都从perl语言发展而来，因此，语法几乎一致。你学好了，一门正则表达式语言。几乎在所有程序语言中就可以用到。就像，我知道sql语法，后端mysql,mssql几乎都通用。这个也是我们需要学好正则表达式一个原因，通用性。另外一个原因是：正则表达式强大的文本匹配功能。很多文本匹配处理，如果没有正则表达式，还真的很难做出来。如：从一段字符串，读出手机号格式，我们如果用字符串查找，需要做循环，需要写判断。估计耗费不少代码，开发时间。如果用正则表达式，就一行代码就可以了。匹配所有成对的：html标签，如果要做这个，我们发现非常复杂，要处理层次，要匹配标签。一般同人短短几个小时可能完成不了。如果用正则表达式，估计也就几分钟而已。</p>
<ul>
<li>
<h3><font style="font-weight: bold">正则表达式字符串格式</font></h3>
</li>
</ul>
<p>既然我们知道正则表达式重要性，通用性。那么我们对常见格式可以了解下。一般正则表达式由：普通字符+特殊字符（元字符）一起组成的字符串。如：匹配“ab开头，后面紧跟数字字符串“&#160;&#160; “ab\d+”&#160; 这其中ab就是普通字符，\d代表可以是0-9数字，+代表前面字符可以出现1次或以上。哈哈，看起来还真的很容易吧！</p>
<p>正则表达式无论是普通还是扩展还是高级正则表达式。不同之处，可能在特殊字符方面有些不同。很多特殊字符，可以组合，形成一套新匹配规则。这里就不说太深了。我们一般只要知道它的常见元字符。基本上常见正则表达式就可以写出来了。 </p>
<p>以下是javascript 正则表达式常见的<strong>元字符</strong>：</p>
<blockquote><div>
<table class="table" border="1" rules="all" cellspacing="0" frame="box">
<thead>
<tr valign="top">
<th width="16%">字符</th>
<th width="84%">描述</th>
</tr>
</thead>
<tbody>
<tr valign="top">
<td width="16%">\</td>
<td width="84%">将下一个字符标记为一个特殊字符、或一个原义字符、或一个 后向引用、或一个八进制转义符。例如，&#8217;n&#8217; 匹配字符 &quot;n&quot;。&#8217;\n&#8217; 匹配一个换行符。序列 &#8216;\\&#8217; 匹配 &quot;\&quot; 而 &quot;\(&quot; 则匹配 &quot;(&quot;。</td>
</tr>
<tr valign="top">
<td width="16%">^</td>
<td width="84%">匹配输入字符串的开始位置。如果设置了 <b>RegExp</b> 对象的 <b>Multiline</b> 属性，^ 也匹配 &#8216;\n&#8217; 或 &#8216;\r&#8217; 之后的位置。</td>
</tr>
<tr valign="top">
<td width="16%">$</td>
<td width="84%">匹配输入字符串的结束位置。如果设置了<b>RegExp</b> 对象的 <b>Multiline</b> 属性，$ 也匹配 &#8216;\n&#8217; 或 &#8216;\r&#8217; 之前的位置。</td>
</tr>
<tr valign="top">
<td width="16%">*</td>
<td width="84%">匹配前面的子表达式零次或多次。例如，zo* 能匹配 &quot;z&quot; 以及 &quot;zoo&quot;。 * 等价于{0,}。</td>
</tr>
<tr valign="top">
<td width="16%">+</td>
<td width="84%">匹配前面的子表达式一次或多次。例如，&#8217;zo+&#8217; 能匹配 &quot;zo&quot; 以及 &quot;zoo&quot;，但不能匹配 &quot;z&quot;。+ 等价于 {1,}。</td>
</tr>
<tr valign="top">
<td width="16%">?</td>
<td width="84%">匹配前面的子表达式零次或一次。例如，&quot;do(es)?&quot; 可以匹配 &quot;do&quot; 或 &quot;does&quot; 中的&quot;do&quot; 。? 等价于 {0,1}。</td>
</tr>
<tr valign="top">
<td width="16%">{<i>n</i>}</td>
<td width="84%"><i>n</i> 是一个非负整数。匹配确定的 <i>n</i> 次。例如，&#8217;o{2}&#8217; 不能匹配 &quot;Bob&quot; 中的 &#8216;o&#8217;，但是能匹配 &quot;food&quot; 中的两个 o。</td>
</tr>
<tr valign="top">
<td width="16%">{<i>n</i>,}</td>
<td width="84%"><i>n</i> 是一个非负整数。至少匹配<i>n</i> 次。例如，&#8217;o{2,}&#8217; 不能匹配 &quot;Bob&quot; 中的 &#8216;o&#8217;，但能匹配 &quot;foooood&quot; 中的所有 o。&#8217;o{1,}&#8217; 等价于 &#8216;o+&#8217;。&#8217;o{0,}&#8217; 则等价于 &#8216;o*&#8217;。</td>
</tr>
<tr valign="top">
<td width="16%">{<i>n</i>,<i>m</i>}</td>
<td width="84%"><i>m</i> 和 <i>n</i> 均为非负整数，其中<i>n</i> &lt;= <i>m</i>。最少匹配 <i>n</i> 次且最多匹配 <i>m</i> 次。刘， &quot;o{1,3}&quot; 将匹配 &quot;fooooood&quot; 中的前三个 o。&#8217;o{0,1}&#8217; 等价于 &#8216;o?&#8217;。请注意在逗号和两个数之间不能有空格。</td>
</tr>
<tr valign="top">
<td width="16%">?</td>
<td width="84%">当该字符紧跟在任何一个其他限制符 (*, +, ?, {<i>n</i>}, {<i>n</i>,}, {<i>n</i>,<i>m</i>}) 后面时，匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串，而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如，对于字符串 &quot;oooo&quot;，&#8217;o+?&#8217; 将匹配单个 &quot;o&quot;，而 &#8216;o+&#8217; 将匹配所有 &#8216;o&#8217;。</td>
</tr>
<tr valign="top">
<td width="16%">.</td>
<td width="84%">匹配除 &quot;\n&quot; 之外的任何单个字符。要匹配包括 &#8216;\n&#8217; 在内的任何字符，请使用象 &#8216;[.\n]&#8216; 的模式。</td>
</tr>
<tr valign="top">
<td width="16%">(<i>pattern</i>)</td>
<td width="84%">匹配<i>pattern</i> 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到，在VBScript 中使用 <b>SubMatches</b> 集合，在JScript 中则使用 <b>$0</b>…<b>$9</b> 属性。要匹配圆括号字符，请使用 &#8216;\(&#8216; 或 &#8216;\)&#8217;。</td>
</tr>
<tr valign="top">
<td width="16%">(?:<i>pattern</i>)</td>
<td width="84%">匹配 <i>pattern</i> 但不获取匹配结果，也就是说这是一个非获取匹配，不进行存储供以后使用。这在使用 &quot;或&quot; 字符 (|) 来组合一个模式的各个部分是很有用。例如， &#8216;industr(?:y|ies) 就是一个比 &#8216;industry|industries&#8217; 更简略的表达式。</td>
</tr>
<tr valign="top">
<td width="16%">(?=<i>pattern</i>)</td>
<td width="84%">正向预查，在任何匹配 <i>pattern</i> 的字符串开始处匹配查找字符串。这是一个非获取匹配，也就是说，该匹配不需要获取供以后使用。例如， &#8216;Windows (?=95|98|NT|2000)&#8217; 能匹配 &quot;Windows 2000&quot; 中的 &quot;Windows&quot; ，但不能匹配 &quot;Windows 3.1&quot; 中的 &quot;Windows&quot;。预查不消耗字符，也就是说，在一个匹配发生后，在最后一次匹配之后立即开始下一次匹配的搜索，而不是从包含预查的字符之后开始。</td>
</tr>
<tr valign="top">
<td width="16%">(?!<i>pattern</i>)</td>
<td width="84%">负向预查，在任何不匹配Negative lookahead matches the search string at any point where a string not matching <i>pattern</i> 的字符串开始处匹配查找字符串。这是一个非获取匹配，也就是说，该匹配不需要获取供以后使用。例如&#8217;Windows (?!95|98|NT|2000)&#8217; 能匹配 &quot;Windows 3.1&quot; 中的 &quot;Windows&quot;，但不能匹配 &quot;Windows 2000&quot; 中的 &quot;Windows&quot;。预查不消耗字符，也就是说，在一个匹配发生后，在最后一次匹配之后立即开始下一次匹配的搜索，而不是从包含预查的字符之后开始 </td>
</tr>
<tr valign="top">
<td width="16%"><i>x</i>|<i>y</i></td>
<td width="84%">匹配 <i>x</i> 或 <i>y</i>。例如，&#8217;z|food&#8217; 能匹配 &quot;z&quot; 或 &quot;food&quot;。&#8217;(z|f)ood&#8217; 则匹配 &quot;zood&quot; 或 &quot;food&quot;。 </td>
</tr>
<tr valign="top">
<td width="16%">[<i>xyz</i>]</td>
<td width="84%">字符集合。匹配所包含的任意一个字符。例如， &#8216;[abc]&#8216; 可以匹配 &quot;plain&quot; 中的 &#8216;a&#8217;。 </td>
</tr>
<tr valign="top">
<td width="16%">[^<i>xyz</i>]</td>
<td width="84%">负值字符集合。匹配未包含的任意字符。例如， &#8216;[^abc]&#8216; 可以匹配 &quot;plain&quot; 中的&#8217;p'。 </td>
</tr>
<tr valign="top">
<td width="16%">[<i>a-z</i>]</td>
<td width="84%">字符范围。匹配指定范围内的任意字符。例如，&#8217;[a-z]&#8216; 可以匹配 &#8216;a&#8217; 到 &#8216;z&#8217; 范围内的任意小写字母字符。 </td>
</tr>
<tr valign="top">
<td width="16%">[^<i>a-z</i>]</td>
<td width="84%">负值字符范围。匹配任何不在指定范围内的任意字符。例如，&#8217;[^a-z]&#8216; 可以匹配任何不在 &#8216;a&#8217; 到 &#8216;z&#8217; 范围内的任意字符。 </td>
</tr>
<tr valign="top">
<td width="16%">\b</td>
<td width="84%">匹配一个单词边界，也就是指单词和空格间的位置。例如， &#8216;er\b&#8217; 可以匹配&quot;never&quot; 中的 &#8216;er&#8217;，但不能匹配 &quot;verb&quot; 中的 &#8216;er&#8217;。 </td>
</tr>
<tr valign="top">
<td width="16%">\B</td>
<td width="84%">匹配非单词边界。&#8217;er\B&#8217; 能匹配 &quot;verb&quot; 中的 &#8216;er&#8217;，但不能匹配 &quot;never&quot; 中的 &#8216;er&#8217;。</td>
</tr>
<tr valign="top">
<td width="16%">\c<i>x</i></td>
<td width="84%">匹配由<i>x</i>指明的控制字符。例如， \cM 匹配一个 Control-M 或回车符。 <i>x</i> 的值必须为 A-Z 或 a-z 之一。否则，将 c 视为一个原义的 &#8216;c&#8217; 字符。 </td>
</tr>
<tr valign="top">
<td width="16%">\d</td>
<td width="84%">匹配一个数字字符。等价于 [0-9]。 </td>
</tr>
<tr valign="top">
<td width="16%">\D</td>
<td width="84%">匹配一个非数字字符。等价于 [^0-9]。 </td>
</tr>
<tr valign="top">
<td width="16%">\f</td>
<td width="84%">匹配一个换页符。等价于 \x0c 和 \cL。</td>
</tr>
<tr valign="top">
<td width="16%">\n</td>
<td width="84%">匹配一个换行符。等价于 \x0a 和 \cJ。</td>
</tr>
<tr valign="top">
<td width="16%">\r</td>
<td width="84%">匹配一个回车符。等价于 \x0d 和 \cM。</td>
</tr>
<tr valign="top">
<td width="16%">\s</td>
<td width="84%">匹配任何空白字符，包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。</td>
</tr>
<tr valign="top">
<td width="16%">\S</td>
<td width="84%">匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。</td>
</tr>
<tr valign="top">
<td width="16%">\t</td>
<td width="84%">匹配一个制表符。等价于 \x09 和 \cI。</td>
</tr>
<tr valign="top">
<td width="16%">\v</td>
<td width="84%">匹配一个垂直制表符。等价于 \x0b 和 \cK。</td>
</tr>
<tr valign="top">
<td width="16%">\w</td>
<td width="84%">匹配包括下划线的任何单词字符。等价于&#8217;[A-Za-z0-9_]&#8216;。 </td>
</tr>
<tr valign="top">
<td width="16%">\W</td>
<td width="84%">匹配任何非单词字符。等价于 &#8216;[^A-Za-z0-9_]&#8216;。 </td>
</tr>
<tr valign="top">
<td width="16%">\x<i>n</i></td>
<td width="84%">匹配 <i>n</i>，其中 <i>n</i> 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如， &#8216;\x41&#8242; 匹配 &quot;A&quot;。&#8217;\x041&#8242; 则等价于 &#8216;\x04&#8242; &amp; &quot;1&quot;。正则表达式中可以使用 ASCII 编码。.</td>
</tr>
<tr valign="top">
<td width="16%">\<i>num</i></td>
<td width="84%">匹配 <i>num</i>，其中 <i>num</i> 是一个正整数。对所获取的匹配的引用。例如，&#8217;(.)\1&#8242; 匹配两个连续的相同字符。 </td>
</tr>
<tr valign="top">
<td width="16%">\<i>n</i></td>
<td width="84%">标识一个八进制转义值或一个后向引用。如果 \<i>n</i> 之前至少 <i>n</i> 个获取的子表达式，则 <i>n</i> 为后向引用。否则，如果 <i>n</i> 为八进制数字 (0-7)，则 <i>n</i> 为一个八进制转义值。</td>
</tr>
<tr valign="top">
<td width="16%">\<i>nm</i></td>
<td width="84%">标识一个八进制转义值或一个后向引用。如果 \<i>nm</i> 之前至少有is preceded by at least <i>nm</i> 个获取得子表达式，则 <i>nm</i> 为后向引用。如果 \<i>nm</i> 之前至少有 <i>n</i> 个获取，则 <i>n</i> 为一个后跟文字 <i>m </i>的后向引用。如果前面的条件都不满足，若 <i>n</i> 和 <i>m</i> 均为八进制数字 (0-7)，则 \<i>nm</i> 将匹配八进制转义值 <i>nm</i>。</td>
</tr>
<tr valign="top">
<td width="16%">\<i>nml</i></td>
<td width="84%">如果 <i>n</i> 为八进制数字 (0-3)，且 <i>m</i> 和 <i>l</i> 均为八进制数字 (0-7)，则匹配八进制转义值 <i>nml。</i></td>
</tr>
<tr valign="top">
<td width="16%">\u<i>n</i></td>
<td width="84%">匹配 <i>n</i>，其中 <i>n</i> 是一个用四个十六进制数字表示的 Unicode 字符。例如， \u00A9 匹配版权符号 (?)。</td>
</tr>
</tbody>
</table></div>
</blockquote>
<p>&#160;</p>
<p>从上面元字符里面，我们看到，很多元字符，实际上可以代表一组普通字符。因此，我们要匹配一些字符串，正则表达式往往会有很多种。如：匹配0-9数字，可以用[0-9],\d,[0123456789] ，这样3种都可以，条条大路通罗马，都是对的。那么那一种正则表达式更好呢，性能更高呢，匹配速度更快呢？通过10万次 循环匹配，发现几种几乎相差不大，\d速度比[0-9快，[0-9]比[0123456789]快。从正则表达式精简]程度方面，\d最简单。使用时候，我们尽量用代表字符集元字符去匹配。精简且速度快！</p>
<ul>
<li>
<h3><font style="font-weight: bold">怎么样书写正则表达式呢？</font></h3>
</li>
</ul>
<h3><strong></strong></h3>
<p>我们写正则表达式，都是从分析匹配字符串特点开始，然后逐步补充其它元字符，普通字符。匹配从左到右。</p>
<p><strong>例如：我们要匹配一个手机号码。</strong></p>
<p>1. 分析字符串特点，手机号码是数字，并且是以1开头，11位长</p>
<p>2.可以写”1\d”&#160;&#160; 1开头，后面跟着数字 也可以是：1[0-9]</p>
<p>3.数字长度是11位 ，继续补充1\d{10} ，后面数字长11字符，也可以是：1[0-9]{10} ；{}里面数字，表示它左边字符可以重复出现次数</p>
<p>4.所有字符必须是11位，因此头尾直接必须满足条件，因此可以是：^1\d{10}$ 了。</p>
<p><strong>例如：我们匹配QQ号码</strong></p>
<p>1.分析QQ号码特点是，号码是 最少是5位数，首位字符非0，最大长度，目前到11位了</p>
<p>2.可以先定义首位字符，[1-9]\d&#160;&#160;&#160; 首位字符是1到9，后面是字符</p>
<p>3.后面字符个数在4到10位 [1-9]\d{4,10}</p>
<p>4.所有字符串必须都满足上面匹配，因为可以写成：^[1-9]\d{4,10}</p>
<p><strong>例如：匹配IP地址</strong></p>
<p>1.分析ip结构是，每节 0-255，中间用”.”分割，一共有4节</p>
<p>2.首先我们写第一个0-255 ，可以分解为0-9 一位数,10-99两位数,100-199三位数,200-249三位数第2节,250-255第四节</p>
<p>[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]&#160;&#160; “|”表示或者，计算优先级最低，左右两边可以是多个元字符普通字符组合字符串为一个整体。</p>
<p>3.这样的字符，有三次重复，中间加”.” ，所以结果是：</p>
<p>[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]\. ，因为是点字符是元字符，所有需要转义。这样是不是可以了呢，我们发现有问题，”|”优先级最低，这样会把最后\.字符表，组合为：“25[0-5] \.”了。因此，应该是前面几种情况，后面跟个”.”字符，正确是：([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\. ，这样就达到要求了。我们会发现，实际上每家一个()字符，都一个子匹配，会在匹配结果里面出现()内容。这里我们加()目的是，让优先计算，因此不需要里面子匹配内容。我们可以加忽略子匹配内容字符：?: ，结果将变为：(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\. </p>
<p>4.一段已经匹配到了，然后我们这样需要重复三次，我们可以直接重复上一个表达式3次：</p>
<p>方法一：(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.</p>
<p>方法二：把第一段作为分组，重复3次&#160;&#160;&#160; ((?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3} ，然后同样忽略子匹配结果，可以变为：</p>
<p>(?:(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3} 哈哈，看到这个表达式是不是很晕了，其实一个长的表达式，都是从一点一点加上去的。这个利用到，重复次数，将结果简化不少了。</p>
<p>5.最后还有一段0-255匹配</p>
<p>(?:(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]) ，也就是在后面加多一个0-255匹配即可，然后在上面再加上头尾限定符，变成了：^(?:(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$</p>
<p>下面一个图，是读一段文字里面，所有IP个格式地址</p>
<blockquote><p><a href="http://blog.chacuo.net/wp-content/uploads/2013/06/image12.png"><img style="background-image: none; border-right-width: 0px; margin: 0px 0px 0px 10px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.chacuo.net/wp-content/uploads/2013/06/image_thumb12.png" width="896" height="379" /></a></p>
<p>其中(?=……)是正向匹配，搜索左边字符串，并且该字符串右边必须满足?=后面匹配成功的才匹配成功！</p>
</blockquote>
<p>&#160;</p>
<p>好了，写了这么些例子，发现一口气能从很简单正则表达式，匹配到这么长的表达式了。是不是感觉有些晕了，其实不奇怪，长的正则表达式都是从简单正则表达式得到。逐步加上去了。 欢迎讨论交流！</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chacuo.net/190.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>正则表达式（regex)或操作符&#8221;&#124;&#8220;使用易出现功能Bug</title>
		<link>http://blog.chacuo.net/187.html</link>
		<comments>http://blog.chacuo.net/187.html#comments</comments>
		<pubDate>Sun, 09 Jun 2013 11:05:27 +0000</pubDate>
		<dc:creator>程默</dc:creator>
				<category><![CDATA[web原理]]></category>
		<category><![CDATA[学习心得]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[正则表达式]]></category>

		<guid isPermaLink="false">http://blog.chacuo.net/?p=187</guid>
		<description><![CDATA[接上一篇：正则表达式（regex)错误使用导致功能漏洞 ，我们继续梳理，正则表达式错误使用，导致功能设计漏洞（ [...]]]></description>
				<content:encoded><![CDATA[<p>接上一篇：<a href="http://blog.chacuo.net/183.html">正则表达式（regex)错误使用导致功能漏洞</a> ，我们继续梳理，<strong>正则表达式</strong>错误使用，导致功能设计漏洞（bug），做web方面，需要掌握的知识很多，网站开发这项工作，在国内也就10多年，很多开发人员，都是通过：培训(自学) -&gt;模仿-&gt;做项目 ，这样一个过程。很多就是修修改改后，就成为了web开发工程师。这行入门低，很容易上手。但是想成为大师级的，还是很不容易。需要学习，掌握的知识几十门。而对于刚刚入门同人，很多时候因为缺乏系统学习，理论支持。导致提升有些心有余而力不足啦！因此，出现这些或多或少的功能设计漏洞，是很常见的！</p>
<p>好了，有些跑题了，在做代码走查时候，这类漏洞也是时常出现。我们看下，下面代码：</p>
<blockquote>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000088;">$user</span><span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;bcd123张三&quot;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">///匹配用户名中出现abc还有bcd开头，后面紧跟是数字字符</span>
&nbsp;
<span style="color: #990000;">preg_match_all</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;/abc|bcd\d+/&quot;</span><span style="color: #339933;">,</span><span style="color: #000088;">$user</span><span style="color: #339933;">,</span><span style="color: #000088;">$match</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$match</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/*结果是
array(1) {
  [0]=&gt;
  array(1) {
    [0]=&gt;
    string(6) &quot;bcd123&quot;
  }
}
*/</span></pre></td></tr></table></div>

<p>查找所有页面出现abc或者bcd开头，后面紧跟数字字符串。通过上面，我们看，正确匹配到bcd123，如果我们输入:$user = “abc123张三”， 发现不能匹配到了。原因是”|”字符，优先级最低，以上写法会变成：匹配abc 或者是bcd\d+ 字符串。</p>
<p><a href="http://blog.chacuo.net/wp-content/uploads/2013/06/image11.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blog.chacuo.net/wp-content/uploads/2013/06/image_thumb11.png" width="714" height="309" /></a> </p>
<p>以上图，将|，包含到()中。</p>
</blockquote>
<p>&#160;</p>
<p>如果要提升优先级，可以(abc|bcd)\d+ ，匹配所有abc或者bcd 字符串，并且后面紧跟数字的。在使用”|”字符串，注意它的优先级级别低，如果要优先匹配，可以放入（）中。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chacuo.net/187.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>正则表达式（regex)错误使用导致功能漏洞</title>
		<link>http://blog.chacuo.net/183.html</link>
		<comments>http://blog.chacuo.net/183.html#comments</comments>
		<pubDate>Sat, 08 Jun 2013 14:05:00 +0000</pubDate>
		<dc:creator>程默</dc:creator>
				<category><![CDATA[web原理]]></category>
		<category><![CDATA[学习心得]]></category>
		<category><![CDATA[正则表达式]]></category>

		<guid isPermaLink="false">http://blog.chacuo.net/?p=183</guid>
		<description><![CDATA[写在前面的话 正则表达式它的强大字符串匹配功能，导致目前在各种程序语言中，都非常流行！它被用来描述或者匹配一系 [...]]]></description>
				<content:encoded><![CDATA[<p><strong>写在前面的话</strong></p>
<p>正则表达式它的强大字符串匹配功能，导致目前在各种程序语言中，都非常流行！它被用来描述或者匹配一系列符合某个句法规则的字符串。很多刚刚使用正则表达式都是从听说这个，然后在要使用时候去网上搜索。 很少人一开始就系统去学习正则表达式，从定义原理使用系统学习。因为，对应初学者觉得它太麻烦了，好多原字符。看到那么长一串字符，就很头痛。因此，也懒得去学习。一般遇到问题，直接去网上搜索。如：“邮箱正则表达式，手机号正则表达式，url正则表达式…..” ，我们发现一个很有意思现象，“怎么邮箱正则表达式可以各种各样，url正则表达式也不相同“，都出都在推荐，都说自己是正确的，到底那个是正确的呢？ </p>
<p>从各异的正则表达式，我们可以得出2个结论。一、正则表达式很灵活，多种方法可以实现同一种结果（条条大路通罗马），二、正则表达式匹配结果需要验证的，复杂正则表达式很容易产生错误匹配。今天，我这里不说正则表达式灵活性，我们看看常见正则表达式错误使用，产生功能漏洞例子。希望，我们在使用时候多多注意。以下例子，来自我工作中审核代码，经常出现例子，也欢迎朋友们补充！</p>
<p><strong>定界符”^$”缺失bug</strong></p>
<blockquote>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #666666; font-style: italic;">///检测用户名，只能是字符加数字</span>
&nbsp;
<span style="color: #000088;">$user</span><span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;chengmo8&quot;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">preg_match</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;&lt;strong&gt;/[0-9a-zA-Z]+/&lt;/strong&gt;&quot;</span><span style="color: #339933;">,</span><span style="color: #000088;">$user</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #990000;">exit</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;用户名错误！&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

</blockquote>
<p>这是很常见的，因为没有定界符，正则表达式搜索，会从$user中，字符中从左向右搜索，指导找到满足条件的字符，就会匹配到，并且返回true，程序将继续执行。我们测试，用户名输入：chengmo8，chengmo8??!，#$chengm，中国cadadf，都可以匹配成功，看似要限制只能字符加数字用户名。实际由于缺乏限定符正则表达式，变成了，<u>只要字符串中包含字母加数字</u>就可以注册。而我们需要的是，从头到尾字符串必须是字母加数字。正则表达式应该是：<font style="background-color: #4f81bd" color="#ffffff">^[0-9a-zA-Z]+$ </font>&#160; ，看似简单，在做从头到尾字符匹配时候，不要忘记了^$字符。一个匹配输入字符开头，一个匹配输入字符结尾（默认换行符前)</p>
<p>这种经常做，手机号，邮箱，url，注册用户名，密码等。都需要有限定符号！</p>
<p><strong>方括号字符&quot;[ ]”中字符使用Bug</strong></p>
<p>在正则表达式中，<u>常见正则表达式原字符（.*?等等）在方括号字符中将变成普通字符。</u> <u>在方括号字符中，表示特殊字符，只有“^-\” 3个字符是特殊字符</u>。其中，“^”字符，在左方括号第一个字符时候，是代表不在后面所有字符中字符！</p>
<p>如：[^0]不能是0字符。而如果是：[0^] ，就代表包含0^字符了。因为：^已经不是左括号最右边一个字符了。 已经跟普通字一样了。“-”字符代表是范围字符，如：[0-9] 代表是匹配0到9直接字符。”\”转义字符，如果想匹配”-“字符，可以[0\-9]，如果要匹配”\”，可以是：[0\\9]，表示“09\” 3个字符了。说这么些，其实就是因为，很多朋友在使用方括号字符时候，经常会弄错特殊字符。</p>
<blockquote>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #666666; font-style: italic;">///检测用户名，只能是字符加数字</span>
&nbsp;
<span style="color: #000088;">$code</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">///匹配字符范围包含.*?</span>
<span style="color: #990000;">preg_match</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;/[.*?]+/&quot;</span><span style="color: #339933;">,</span><span style="color: #000088;">$code</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">///匹配字符范围包含a到z 26个字符</span>
<span style="color: #990000;">preg_match</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;/[a-z]+/&quot;</span><span style="color: #339933;">,</span><span style="color: #000088;">$code</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">///匹配字符范围包含A到z 实际上，是从默认情况ascii表中，A字符到z字符中间，一共48字符</span>
<span style="color: #990000;">preg_match</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;/[A-z]+/&quot;</span><span style="color: #339933;">,</span><span style="color: #000088;">$code</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">///匹配字符范围包含A到z 是对应ascill码，16进制</span>
<span style="color: #990000;">preg_match</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;/[x41-x7A]+/&quot;</span><span style="color: #339933;">,</span><span style="color: #000088;">$code</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #339933;">&lt;</span>font color<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;#ff0000&quot;</span><span style="color: #339933;">&gt;</span><span style="color: #666666; font-style: italic;">///只想匹配字符串and</span>
<span style="color: #990000;">preg_match</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;/[and]/&quot;</span><span style="color: #339933;">,</span><span style="color: #000088;">$code</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">///实际匹配，所有包含a,n,d 组成所有字符，跟顺序无关</span>
<span style="color: #339933;">&lt;/</span>font<span style="color: #339933;">&gt;</span></pre></td></tr></table></div>

</blockquote>
<p>&#160;</p>
<p>加红是经常错误理解，只想匹配and，一旦加入到&quot;[ ]&quot;中字符，可以理解为所有字符组成字符 集合。任意在其中出现字符，就可以匹配，跟顺序无关系！如果真需要匹配这类，按字符分组来，如”and|bnd” 将匹配and字符串，或者是bnd字符串。”|”字符是，字符串或操作符。左右两边连续字符串会组合为一个整体匹配。</p>
<p>好了，今天就整理，常见正则表达式，2种常见错误。欢迎大家交流！</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chacuo.net/183.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>姓名中点字符输入思考（输入特殊字符）</title>
		<link>http://blog.chacuo.net/174.html</link>
		<comments>http://blog.chacuo.net/174.html#comments</comments>
		<pubDate>Fri, 07 Jun 2013 14:46:53 +0000</pubDate>
		<dc:creator>程默</dc:creator>
				<category><![CDATA[web原理]]></category>
		<category><![CDATA[学习心得]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[字符编码]]></category>

		<guid isPermaLink="false">http://blog.chacuo.net/?p=174</guid>
		<description><![CDATA[最近工作中，时不时有用户输入自己真实姓名，然后申请银行提款时候，遇到一些特殊字符。而输入错误，提款失败！其中最 [...]]]></description>
				<content:encoded><![CDATA[<p>最近工作中，时不时有用户输入自己真实姓名，然后申请银行提款时候，遇到一些特殊字符。而输入错误，提款失败！其中最多就是少数名字，姓名中的点字符。如：某某·李四，经常有人输入：某某.李四 或 某某・李四。其中：”·・” 这2个中间点很容易输入错误。都是中间点，一个大一个细。</p>
<ul>
<li>
<h3><font style="font-weight: bold">那一个才是中文姓名中间点呢？</font></h3>
</li>
</ul>
<p>作为技术开发人员，我们有办法知道，到底那个点才是中文中间分割点。因为，这些都是常见姓名字符，因此，我们只要检测下，这2个字符对应在gb2312字符集中，字符编码即可。对于计算机而言，无论多怪的字符，看起来还怎么像，其实计算机本质去区分，是按照字符在字符集中，对应编码（字符编码）来保存、传输的。 因此，作为技术人员，只要能够判断字符在字符集中编码，就能知道对应字符是不是相同的。</p>
<blockquote><p><a href="http://blog.chacuo.net/wp-content/uploads/2013/06/image9.png"><img style="background-image: none; border-right-width: 0px; margin: 0px 0px 0px 10px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.chacuo.net/wp-content/uploads/2013/06/image_thumb9.png" width="785" height="203" /></a></p></blockquote>
<p>从上面看，在gb2312中，第一个字符编码是a1a4,第二个字符返回是%3F，这个是”?”，其实意思是，该字符在这个字符集gb2312中找不到，就默认返回”?”，经常做大字符集，转小字符集合时候常遇到。毫无疑问，我们可以确定第一个字符才是姓名中分隔符，第二个只是看起来更象中文分隔符字符而已。后来查询，发现，其实”・”是日文中的分隔符。通过这种方法，我们其实很容易通过程序就可以查出真假“李逵”啦！</p>
<ul>
<li>
<h3><font style="font-weight: bold">怎么样快速输入相似字符呢？</font></h3>
</li>
</ul>
<p>对于技术人员，已经知道怎么样辨别真假李逵了。 那么，如果有些自己常见的字符，我要去输入，我该怎么样去做呢？查询输入中文姓名中间点，方法很多。</p>
<blockquote><p><font style="background-color: #ffffff" face="Arial">1、智能ABC状态，直接按“`”键盘</font></p>
<p><font style="background-color: #ffffff" face="Arial">2、五笔输入法按，shiftv+ @键</font></p>
<p><font style="background-color: #ffffff" face="Arial">…… </font></p>
</blockquote>
<p><font style="background-color: #ffffff" face="Arial">这里省略N多方法，方法都能很快打印出字符，但是都有各自前提条件，都跟需要安装输入法有关系。如果，选择错误输入法，又很容易将相似字符输入进入。对于，普通用户，还是很难区分。</font></p>
<p><font style="background-color: #ffffff" color="#9b00d3" face="Arial"><u>我们必须找个，统一输入法，无论什么用户都可以正确输入！</u></font></p>
<p>我们知道目前最大字符集是unicode，也叫万国码，里面可以存储100多万字符，而且几乎所有字符集中，字符都在该字符集中能够找到，那么，我们只要知道字符在该字符中编码，就可以唯一确定一个字符。 对于windows而言，目前可以快速输入unicode码字符，只需要打开锁定数字键，按住：alt + unicode字符位置编码数字（小键盘）&#160; 即可。</p>
<p>如：我们发现”·” 字符unicode编码是 183，因此只要打开数字锁定键，按住alt + 小键盘输入183&#160;&#160; 松开alt即可。问题似乎变成了，怎么样知道字符的unicode编码了。</p>
<ul>
<li>
<h3><font style="font-weight: bold">怎么样知道字符unicode编码？</font></h3>
</li>
</ul>
<p>unicode由于字符非常多，因此，常有几种实现模式，utf-8,utf-16等。都是unicode字符集一种存储编码方式。我们只需要将任意字符转换到utf-32编码即可，utf-32每个字符用4个字节表示。结果，跟unicode值一致。只是都占用4个字节而已。</p>
<blockquote>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #666666; font-style: italic;">///当前文件选择utf-8字符集</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
 *得到字符的unicode字符编码值*
 * @author QQ:8292669
 * @copyright http://blog.chacuo.net
 * @param string $char 传入单字符
 * @return int 10禁止字符值
 */</span>
<span style="color: #000000; font-weight: bold;">function</span> getUnicodeDec<span style="color: #009900;">&#40;</span><span style="color: #000088;">$char</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$c</span> <span style="color: #339933;">=</span> <span style="color: #990000;">iconv</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;utf-8&quot;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">&quot;utf-32BE&quot;</span><span style="color: #339933;">,</span><span style="color: #000088;">$char</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">///得到4个16进制字节</span>
	<span style="color: #b1b100;">return</span> <span style="color: #990000;">array_pop</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">unpack</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'N'</span><span style="color: #339933;">,</span><span style="color: #000088;">$c</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>   <span style="color: #666666; font-style: italic;">///16进制转换为10机制</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;·&quot;</span><span style="color: #339933;">,</span> getUnicodeDec<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'·'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;・&quot;</span><span style="color: #339933;">,</span> getUnicodeDec<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'・'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

</blockquote>
<blockquote><p><a href="http://blog.chacuo.net/wp-content/uploads/2013/06/image10.png"><img style="background-image: none; border-right-width: 0px; margin: 0px 0px 0px 10px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.chacuo.net/wp-content/uploads/2013/06/image_thumb10.png" width="547" height="228" /></a></p></blockquote>
<p>从上面，我们可以看到一个用alt+183,一个用alt+12539输入。 这样看起来输入很难记住，不过，如果某个人自己姓名刚好有特殊字符，这种方法是个不错选择。你只要记住自己姓名特殊字怎么输入就行。记住后，以后无论那个电脑上面，就可以准确无误输入。呵呵，是个不错的选择！如果，我姓名里面，有难打字符。要输入：程默，分别是：alt +31243,alt + 40664 就可以了。</p>
<p>后记：从技术角度分析下，其实我们遇到这类问题，都可以方便甄别，也可以有个一劳永逸的办法。当然，没有特殊难输入字符，完全没有必要去记录编码啦。 好了，就这里，欢迎朋友们交流！</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chacuo.net/174.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>识别真假搜索引擎（搜索蜘蛛）方法（baidu,google,Msn,sogou,soso等)</title>
		<link>http://blog.chacuo.net/147.html</link>
		<comments>http://blog.chacuo.net/147.html#comments</comments>
		<pubDate>Tue, 04 Jun 2013 11:10:16 +0000</pubDate>
		<dc:creator>程默</dc:creator>
				<category><![CDATA[web原理]]></category>
		<category><![CDATA[学习心得]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[搜索引擎]]></category>

		<guid isPermaLink="false">http://blog.chacuo.net/?p=147</guid>
		<description><![CDATA[最近工作中遇到个问题，就是有一些资源，不希望别人很派发的抓取，这样会占用我们带宽还有资源。因此，我们对页面访问 [...]]]></description>
				<content:encoded><![CDATA[<p>最近工作中遇到个问题，就是有一些资源，不希望别人很派发的抓取，这样会占用我们带宽还有资源。因此，我们对页面访问做了频率限制。这样一来，又怕搜索蜘蛛给限制了。 因此，我们有个需求，就是除了常见搜索蜘蛛，其它都要做频率限制。 工作就变成了，首先我们怎么样正确表示搜索蜘蛛。</p>
<ul>
<li>
<h3><strong>怎么样识别搜索蜘蛛</strong></h3>
</li>
</ul>
<h3><strong></strong></h3>
<p>搜索引擎基本上由最先google,和国内的baidu统一了。刚开始比较混乱，后期有很多规则协议，可以遵循。基本上一些新兴的搜索引擎在访问站点时候，都会延用google制定的一些规则。它们一般都会有特定的user-agent，但是，如果我们只通过user-agent去识别搜索蜘蛛的话，那样第三方抓取程序，都会去伪造个user-agent。变成搜索蜘蛛的，如：Googlebot/2.1 (+<a href="http://www.googlebot.com/bot.html)%C2%A0">http://www.googlebot.com/bot.html) </a>是，google蜘蛛的值。</p>
<p>现在一般搜索引擎都提供一个DNS 反向IP查询功能，只需要把访问来的IP 通过反向查询域名，看是不是搜索引擎域名。这样伪造的爬虫工具，就会被很容易识别了。 具体识别真假蜘蛛只需要：<u><font color="#0000ff">1，判断user-agent是否满足蜘蛛格式 2，然后进一步确定IP 反解析域名是否属于该搜索引擎域名.</font></u></p>
<table class="table" border="0" cellspacing="1" cellpadding="4" width="732" align="center">
<tbody></tbody>
<thead>
<tr>
<td width="102"><strong>搜索引擎</strong></td>
<td width="104"><strong>user-agent(包含)</strong></td>
<td width="77"><strong>是否PTR</strong></td>
<td width="442"><strong>备注</strong></td>
</tr>
</thead>
<tbody>
<tr>
<td width="102">google</td>
<td width="104">Googlebot</td>
<td width="77">√</td>
<td width="442">host ip&#160; 得到域名：googlebot.com主域名</td>
</tr>
<tr>
<td width="102">baidu</td>
<td width="104">Baiduspider</td>
<td width="77">√</td>
<td width="442">host ip&#160; 得到域名：*.baidu.com 或 *.baidu.jp</td>
</tr>
<tr>
<td width="102">yahoo</td>
<td width="104">Yahoo!</td>
<td width="77">√</td>
<td width="442">host ip&#160; 得到域名：inktomisearch.com主域名 </td>
</tr>
<tr>
<td width="102">Sogou</td>
<td width="104">Sogou</td>
<td width="77">×</td>
<td width="442">
<p>*Sogou web spider/3.0(+<a href="http://www.sogou.com/docs/help/webmasters.htm#07&Prime;)&nbsp;">http://www.sogou.com/docs/help/webmasters.htm#07″) </a>            <br />*Sogou Push Spider/3.0(+<a href="http://www.sogou.com/docs/help/webmasters.htm#07&Prime;)&nbsp;">http://www.sogou.com/docs/help/webmasters.htm#07″) </a></p>
</td>
</tr>
<tr>
<td width="102">网易</td>
<td width="104">YodaoBot</td>
<td width="77">×</td>
<td width="442">*Mozilla/5.0 (compatible; YodaoBot/1.0; <a href="http://www.yodao.com/help/webmaster/spider/%E2%80%9D;">http://www.yodao.com/help/webmaster/spider/”;</a> ) </td>
</tr>
<tr>
<td width="102">MSN</td>
<td width="104">MSNBot</td>
<td width="77">√</td>
<td width="442">host ip&#160; 得到域名：live.com主域名</td>
</tr>
<tr>
<td width="102">360</td>
<td width="104">360Spider</td>
<td width="77">×</td>
<td width="442">Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.0.11)&#160; Firefox/1.5.0.11; 360Spider</td>
</tr>
<tr>
<td width="102">soso</td>
<td width="104">Sosospider</td>
<td width="77">×</td>
<td width="442">Sosospider+(+http://help.soso.com/webspider.htm)</td>
</tr>
<tr>
<td width="102">bing</td>
<td width="104">bingbot</td>
<td width="77">√</td>
<td width="442">host ip&#160; 得到域名：msn.com主域名</td>
</tr>
</tbody>
</tbody>
</table>
<p>以上是我整理一些常用搜索引擎的user-agent特征码，以及IP反向解析情况。保证准确识别搜索引擎，我们通过IP反解析是最为准确方法。好在google,baidu,bing都有做反向解析。基本上占用了80%搜索市场了。下面，我是我检测方法。</p>
<ul>
<li>
<h3><strong>PHP反解析IP方法</strong></h3>
</li>
</ul>
<blockquote><pre style="text-indent: 0px" lang="php">&lt;?php
/**
 *检查IP及蜘蛛真实性
 * (check_spider('66.249.74.44',$_SERVER['HTTP_USER_AGENT']));
 * @copyright  http://blog.chacuo.net
 * @author 8292669
 * @param string $ip IP地址
 * @param string $ua ua地址
 * @return false|spidername  false检测失败不在指定列表中
 */
function check_spider($ip,$ua)
{
	static $spider_list=array(
	'google'=&gt;array('Googlebot','googlebot.com'),
	'baidu'=&gt;array('Baiduspider','.baidu.'),
	'yahoo'=&gt;array('Yahoo!','inktomisearch.com'),
	'msn'=&gt;array('MSNBot','live.com'),
	'bing'=&gt;array('bingbot','msn.com')
	);
	
	if(!preg_match('/^(\d{1,3}\.){3}\d{1,3}$/',$ip)) return false;
	if(empty($ua)) return false;
 
	foreach ($spider_list as $k=&gt;$v)
	{
		///如果找到了
		if(stripos($ua,$v[0])!==false)
		{
			$domain = gethostbyaddr($ip);

			if($domain &amp;&amp; stripos($domain,$v[1])!==false)
			{
				return $k;
			}
		}
	}
	return false;
}</pre>
</blockquote>
<p>&#160;</p>
<p>目前只加入几个搜索引擎检测，这些是可以做反解析查询的。不能做反解析查询的，最好做速度限制，用户会使用它们来伪造搜索引擎来抓取你的资源。欢迎大家交流，先写到这里了。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chacuo.net/147.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP 站点相对包含，路径的问题解决方法（include,require)</title>
		<link>http://blog.chacuo.net/134.html</link>
		<comments>http://blog.chacuo.net/134.html#comments</comments>
		<pubDate>Sat, 01 Jun 2013 09:53:18 +0000</pubDate>
		<dc:creator>程默</dc:creator>
				<category><![CDATA[web原理]]></category>
		<category><![CDATA[web性能]]></category>
		<category><![CDATA[学习心得]]></category>
		<category><![CDATA[相对路径]]></category>

		<guid isPermaLink="false">http://blog.chacuo.net/?p=134</guid>
		<description><![CDATA[以前看了，很多框架，基本上很少使用相对路径包含。而一般很多做php web站点，喜欢用相对路径。 认为这样，无 [...]]]></description>
				<content:encoded><![CDATA[<p>以前看了，很多框架，基本上很少使用相对路径包含。而一般很多做php web站点，喜欢用相对路径。 认为这样，无论目录放到那里。 只要跟另外目录关系一致。那么就不会出现问题。如果一个站点，一般都认为，如果用根目录，经常会改变网站地址，觉得很不方便。其实，我们从各大常见框架里面会发现，基本上都是采用是绝对路径方法。</p>
<ul>
<li>
<h3><font style="font-weight: bold">相对路径带来问题</font></h3>
</li>
</ul>
<p>我们有如下结构的目录。</p>
<blockquote><pre style="text-indent: 0px">&lt;web&gt;(网站根目录)
├&lt;a&gt;文件夹
│ │
│ └a.php
├&lt;b&gt;文件夹
│ │
│ └b.php
└test.php</pre>
</blockquote>
<p></p>
<p>&#160;</p>
<p>如果b.php 包含a.php (include(“../a/a.php”)) ，然后test.php 包含b.php (include(“b/b.php”)) ，我们发现很奇怪问题。</p>
<p>首先访问：b.php 可以正常访问， 然后访问test.php</p>
<p><a href="http://blog.chacuo.net/wp-content/uploads/2013/06/image.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.chacuo.net/wp-content/uploads/2013/06/image_thumb.png" width="769" height="103" /></a></p>
<p>发现，找不到 a.php了。 这里注意一个问题是：<strong><u>php 默认相对路径都是以，被访问页面所在路径为准的。无论一个入口页面，里面包含多少文件，相对路径，都是以这个页面为准</u></strong>。</p>
<p>如果访问test.php 根路径是：test.php，如果访问b.php 相对路径都以b.php 所在路径为准。刚刚页面test.php 包含了b.php,b.php包含了a.php. 所有包含都以test.php 为准的。</p>
<p>估计刚刚开始php学习朋友，经常遇到这个问题，而且发现经常出现一大堆警告影响大家学习的兴趣。</p>
<ul>
<li>
<h3><font style="font-weight: bold">使用绝对路径方法</font></h3>
</li>
</ul>
<p>各大开源框架基本上采用绝对路径方法，这样可以避免相对路径因为包含访问文件变了。基准路径变化，让包含出现错误了。 所以，我们看看常见方法。</p>
<p>首先将网站基准订到一个固定文件。一般可以用下面方法实现。如：根目录下面有个config.php文件。</p>
<blockquote>
<p><font style="background-color: #ffffff" face="Arial">&lt;?php </font></p>
<p><font style="background-color: #ffffff" face="Arial">define(‘Root_Path’,<b>dirname(__FILE__));</b></font></p>
</blockquote>
<p>__FILE__ 至的是当前脚本路径，在那个脚步php里面调用该变量，它的值就是该脚步的绝对路径。</p>
<p>然后，任何其它页面，在做包含时候，只需要包含了该config.php后。</p>
<blockquote>
<p><font style="background-color: #ffffff" face="Arial">&lt;?php</font></p>
<p><font style="background-color: #ffffff" face="Arial">包含config.php…..</font></p>
<p><font style="background-color: #ffffff" face="Arial">include(Root_Path.”/文件路径”);即可</font></p>
</blockquote>
<p>&#160;</p>
<h3></h3>
<ul>
<li>
<h3><strong>使用绝对路径好处</strong></h3>
</li>
</ul>
<p>使用解决路径好处除了可以在大型项目中，包含时候更准确定位到文件，不易产生错误外。还有另外一个好处，包含文件，性能会得到很大提升。</p>
<p>如果给一个相对位置包含，php查找该文件，一般会在set_include_path 函数，设置的所有路径里面去搜索。 我们知道，要一个一个去尝试，列举目录，然后查找文件。这直接会消耗大的IO。 也会消耗很多性能。 如果我们用绝对包含，直接就可以准确判断出，文件是否存在。不会去set_include_path设置目录去查找了。 </p>
<p>以上问题，对于刚刚接触到php大型项目开发，可能会很容易遇到。欢迎讨论！</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chacuo.net/134.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>windows live writer 写wordpress 博客</title>
		<link>http://blog.chacuo.net/130.html</link>
		<comments>http://blog.chacuo.net/130.html#comments</comments>
		<pubDate>Fri, 31 May 2013 15:33:35 +0000</pubDate>
		<dc:creator>程默</dc:creator>
				<category><![CDATA[学习心得]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://blog.chacuo.net/?p=130</guid>
		<description><![CDATA[一直以来，在网上编辑器里面写wordpress 博客，就怕没有保存丢失内容，还有就是大量的图片上存。排版加水印 [...]]]></description>
				<content:encoded><![CDATA[<p>一直以来，在网上编辑器里面写wordpress 博客，就怕没有保存丢失内容，还有就是大量的图片上存。排版加水印等也比较复杂。 一直寻找可客户端软件，能够通过软件写wordpress博客。也可以在线管理博客！</p>
<p>其实，win7 自带的live write 就可以很好完成，而且它有丰富的插件。能够很方便完成图片上存，代码着色等工作。下面我们逐一介绍，希望对大家有帮助。</p>
<ul>
<li>
<h3><font style="font-weight: bold">配置windows live writer 管理wordpress</font></h3>
</li>
</ul>
<h4><font style="font-weight: bold">1、添加帐号</font></h4>
<h3><a href="http://blog.chacuo.net/wp-content/uploads/2013/05/image24.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px 0px 0px 10px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.chacuo.net/wp-content/uploads/2013/05/image_thumb24.png" width="540" height="375" /></a></h3>
<h4><font style="font-weight: bold">2、配置日志</font></h4>
<p><a href="http://blog.chacuo.net/wp-content/uploads/2013/05/image25.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px 0px 0px 10px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.chacuo.net/wp-content/uploads/2013/05/image_thumb25.png" width="560" height="528" /></a></p>
<p><a href="http://blog.chacuo.net/wp-content/uploads/2013/05/image26.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px 0px 0px 10px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.chacuo.net/wp-content/uploads/2013/05/image_thumb26.png" width="567" height="536" /></a></p>
<p><a href="http://blog.chacuo.net/wp-content/uploads/2013/05/image27.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px 0px 0px 10px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.chacuo.net/wp-content/uploads/2013/05/image_thumb27.png" width="559" height="531" /></a></p>
<h4><font style="font-weight: bold">3、开始写自己的博客了</font></h4>
<p><a href="http://blog.chacuo.net/wp-content/uploads/2013/05/image28.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px 0px 0px 10px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.chacuo.net/wp-content/uploads/2013/05/image_thumb28.png" width="749" height="454" /></a></p>
<p>&#160;</p>
<h4></h4>
<ul>
<li>
<h3><font style="font-weight: bold">使用技巧</font></h3>
</li>
</ul>
<p>1.用户live wirter 多了。你会发现软件里面有，编辑模式、预览模式、源代码模式，可以很方便切换各种模式</p>
<p>2.图片处理简单多了，可以把任意图片，剪切粘贴 到文本任意地方。可以拖地位子，缩放图片。 也可以加上水印。我是live writer 2012版本。 最新版使用跟word类似，排版很方便。</p>
<p>3.你可以到官方网站：<a title="http://plugins.live.com/writer/browse?orderby=featured&amp;page=1" href="http://plugins.live.com/writer/browse?orderby=featured&amp;page=1">http://plugins.live.com/writer/browse?orderby=featured&amp;page=1</a> 下载工具插件，能够实现多种功能</p>
<p>&#160;</p>
<p><strong>后记：</strong></p>
<p>可能你发现你的wordpress 不支持live writer 或者出错了。先找找看，你根目录有没有：xmlrpc.php。 下面我会分享一些，优秀的live wirter 博客插件。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chacuo.net/130.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>wordpress 过滤器原理执行过程分析(源码分析)</title>
		<link>http://blog.chacuo.net/89.html</link>
		<comments>http://blog.chacuo.net/89.html#comments</comments>
		<pubDate>Mon, 27 May 2013 15:42:54 +0000</pubDate>
		<dc:creator>程默</dc:creator>
				<category><![CDATA[web项目框架]]></category>
		<category><![CDATA[学习心得]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://blog.chacuo.net/?p=89</guid>
		<description><![CDATA[从上一篇：wordpress 3.5 filter 消息标签的名称 ，我们知道了wordpress过滤器消息灵 [...]]]></description>
				<content:encoded><![CDATA[<p>从上一篇：<a href="http://blog.chacuo.net/88.html">wordpress 3.5 filter 消息标签的名称</a> ，我们知道了wordpress过滤器消息灵活性。接下来，我们分析下这个具体执行过程。这个也是wordpress 优秀代码一个核心点。学习并使用该方法，应用到自己的站点中，将会给自己的系统带来很大的灵活性提升，扩展性将大大增强。其实这 类设计模式，就是”监听者模式“，先让监听者监听某个事件，只要发生某个事情，就去执行任务。对一个事件，可以添加条监控，分别执行独立任务。 不过，消息过滤模式，它有一个特点，每个执行任务将会返回一个结果，这个结果将作为下一个任务输入参数。第一个任务输入参数，就是发送消息，并且传入的参数。</p>
<p>是不是感觉有点晕晕啦，呵呵，如果对监听者设计模式熟悉的话，比较容易理解的。 打个比方说，教室有张三在看小说，李四在聊天。但是，他们都怕老师进入教师。 因此都监听老师来了的事件。只要老师来了，张三就停止看小说，李四也不能聊天。 有个同学就望风，发现老是来了。 他喊一声：某某老是来了。 然后，张三，李四动作就激发啦。 望风报信同学，是消息的发送者。</p>
<p>实现类似上面2个功能，wordpress主要2个常用函数是：</p>
<p>add_filter($tag, $function_to_add, $priority = 10, $accepted_args = 1) 添加消息主题$tag类型过滤器，过滤函数是：$function_to_add 该函数一定需要有返回值的；$priority是该函数执行优先级；数字越小将越先执行,accepted_args支持传入参数个数，默认是1。 </p>
<p>apply_filters($tag, $value) ，发送过滤主题消息，$tag消息主题，$value 发送需要过滤内容。</p>
<p>&#160;</p>
<p><strong>PHP代码执行该过程原理</strong></p>
<blockquote><p>&#160;</p>
<p>举例说明：</p>
<p>add_filter(‘the_title’,’filter_trim_title’,1,1);</p>
<p>实际实现类似：</p>
<p>$wp_filter[‘the_title’] []= array(‘function’=&gt;’filter_trim_title’…) 用一个数组列表，记录消息所有映射函数，及所有传入参数</p>
<p>如果再有一条</p>
<p>add_filter(‘the_title’,’filter_substr_title’,1,1);</p>
<p>继续执行：</p>
<p>$wp_filter[‘the_title’] []= array(‘function’=&gt;’filter_substr_title’…) ，该消息内容增加一条函数映射</p>
<p>如果这个时候，执行以下代码:apply_filters(‘the_title’,’testtest’)，代码执行将会是类似如下：</p>
<p>$args=’testtest’;</p>
<p>foreach(add_filter(‘the_title’) as $the)</p>
<p>{</p>
<p>$args = call_user_func_array($the['function'], array_slice($args, 1, (int) $the(&#8216;accepted_args&#8217;])); ///循环将该消息所有函数，执行一次，将返回的值作为下一个函数传入值。这里foreach前 会按照优先级排序</p>
<p>}</p>
<p>return $args; ///返回过滤后结果</p>
<p>&#160;</p>
</blockquote>
<p>&#160;</p>
<p>通过上面例子，会发现，添加消息过滤方法，跟发送消息可以不同地方，只要放到一个全局数组中就可以了。 你只要在开始时候，增加过滤消息映射配置，可以变得更多行。 然后，可以再任意地方，发出这类消息，并且传入输入字符。 你会发现，通过该功能做消息的过滤，将是很轻松事情。</p>
<p>&#160;</p>
<p>我们经常下会有从数据库里面读出代码，然后想做输出，这个时候，我们需要做转义操作。如果你的系统在读出内容后，添加了过滤消息发送接口，你需要对输出数据进行处理很容易。如下举例子</p>
<blockquote></blockquote>
<blockquote></blockquote>
<blockquote><p>在通用包含地方添加如下代码（functions.php是不错选择）</p>
<p>&#160;</p>
<p>add_filters(‘the_content’,’filter_contents’);</p>
<p>function filter_contents($data)&#160; </p>
<p>{</p>
<p>&#160;&#160;&#160;&#160; return htmlspecialchars($data);</p>
<p>}</p>
<p>然后在读取数据库地方加入如下代码</p>
<p>function get_content($data)</p>
<p>{</p>
<p>&#160;&#160;&#160;&#160;&#160; return apply_filters(‘the_content’,$data);&#160; //这样将$data作为消息发送，内容数据一起发送出去，所有绑定了’the_content’消息的所有函数，按照顺序串起来过滤内容。第一个过滤后结果，作为第2个输入参数，直到最后一个处理完，返回了内容。就是apply_filters 获得的内容。</p>
<p>}</p>
<p>&#160;</p>
</blockquote>
<p>&#160;</p>
<p>觉得不错吧，这种解耦方法。扩展性大大增强，在你的项目中也用下类似方法吧。 其实实现过程很容易的。 但是，带来的扩展性就非常巨大了。其它处理消息过滤器函数，还有：has_filter() current_filter() merge_filters() remove_filter() remove_all_filters() 等，感兴趣，可以去研究下 它们源码！</p>
<p>不早了，昨晚休息比较晚，今天这个时候，感觉很困了。 欢迎与我交流！</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chacuo.net/89.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>《我的博客》之选择公共博客平台还是自建博客站点</title>
		<link>http://blog.chacuo.net/42.html</link>
		<comments>http://blog.chacuo.net/42.html#comments</comments>
		<pubDate>Fri, 24 May 2013 11:11:15 +0000</pubDate>
		<dc:creator>程默</dc:creator>
				<category><![CDATA[学习心得]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://blog.chacuo.net/?p=42</guid>
		<description><![CDATA[前言：看到很多同人有自己的博客，也知道它的重要性，以及带来诸多好处。 于是乎准备开始搭建一个自己的技术博客平台 [...]]]></description>
				<content:encoded><![CDATA[<p><strong>前言：</strong>看到很多同人有自己的博客，也知道它的重要性，以及带来诸多好处。 于是乎准备开始搭建一个自己的技术博客平台。分享经验教训，分享技术前瞻，聊聊自己对新鲜事务看法。 于是准备开始搭建平台了，首先遇到棘手问题就是，家按在那里呢？</p>
<p><strong>博客安家在那里呢？</strong></p>
<p>这个可能是很多朋友比较纠结的问题。自己建个博客站点，还是在公共平台申请呢？ 可能很多朋友看到很多博客公共平台上面，有些用户流量很高，访问量也多，于是打算去申请一个。这里各有各的好处，各有各的问题。 以下分析来自个人观点，欢迎交流！</p>
<p><strong>公共博客平台PK独立搭建博客</strong></p>
<p>其实，我3年前在知名博客站点，开通了博客，大概2,3 个月， 排名就进入1000多位。 后来，一直没有打理，现在每天访问量，有近千UV，不过现在我打算独立出来，搭建自己博客站点。自己搭建博客系统，跟在公共平台建博客 不同之处。 好比是一个是专卖品牌店，一个就是超市柜台档口。超市当然有自己的名气，有自己的客户，基本上你不用太多打理，你访问量也不会太少。只要，你努力经验一番，很快你人气就会大涨。但是，这时你发现很多会被限制。如：你要扩张店面，你要开辟更多东西，你要做营销广告等等。 这个时候，你发现基本上很难加入，因为你的档口大小位置空间都固定了。另外一个就是，访问量多了，也很难打造自己的品牌。 大家更多记得是超时名称，大家买的都相同。他们可能记得更清楚是，某某超时里面有个蛋糕柜台，摊主是某某某。 当然，如果你另外开店面平台，前期投入会比较大，你需要去买空间、域名，需要取找程序代码，还可能需要请专业人员装修店面。 而且，你会发现你前期投入，因为你店面很偏僻，在很久很久时候，还很少有人来光顾。这个时候，你会发现，你的付出与回报不成正比。尽管，你发现很多个人名家博客，很强大，人气很多。但是，估计他们只是千千万万博主中，坚持下来的为少数。 很多博主，或许因为看不到黎明太阳，而在五更前将平台放弃了。也有朋友说，这类博客，一定要原创，一定要经常更新，一定要坚持一年以上，才会逐渐有人气。大多数的博主，都会很快失去信心，很快不能坚持下去。其实，这个时候，你坚持下去，<strong>增加自己的知识视野远远比带来人气提升价值大多了</strong>。</p>
<p><strong>先用公共平台后搭建独立博客平台</strong></p>
<p>我的过程，可能也是很多朋友也是这样。 经常看到，默默很牛博客平台，上面某个博主搬家了。 然后，有一个自己独立博客站点。 我想这样兼顾了2种平台利弊。前期快速开展了自己的博客，锻炼了自己写作方面技巧，也积累一定人气，也有自己的朋友圈。这个时候，人气增长，发现对自己带来其它商业价值在受约束。 于是乎搭建自己的独立博客平台。 这时，你发现因为自己经验增强，对博客平台搭建等等可能更多了解。投入一小部分成本，很快有自己的平台。 由于自己在公共平台的人气，很快会带来一批用户过来。自己也会在独立平台，更卖力写作，创作。平台会逐步逐步提升，只要坚持漫长的一段时间，一定会越来越好！</p>
<p><strong>后记：</strong></p>
<p>以上是我的一个经验，欢迎交流！我也是后期打算建立自己的独立博客系统，接下来，我将继续分享，自己为什么选择wordpress原因，以及我对于该博客系统一些见解（从技术层面）。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chacuo.net/42.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>《我的博客》之怎么样写好一篇技术博客</title>
		<link>http://blog.chacuo.net/27.html</link>
		<comments>http://blog.chacuo.net/27.html#comments</comments>
		<pubDate>Thu, 23 May 2013 15:50:58 +0000</pubDate>
		<dc:creator>程默</dc:creator>
				<category><![CDATA[学习心得]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://blog.chacuo.net/?p=27</guid>
		<description><![CDATA[前言： 作为工作比较久的人员，经常会带一些新人。怎么样快速让新人能够上手，更快的成长起来，这是作为管理者需要考 [...]]]></description>
				<content:encoded><![CDATA[<p><strong>前言：</strong></p>
<p>作为工作比较久的人员，经常会带一些新人。怎么样快速让新人能够上手，更快的成长起来，这是作为管理者需要考虑问题。 一个新人，成长快慢，除了自身因素外，他的导师传递知识方式方法，我认为非常重要。你是给他鱼，还是渔呢？ 好的方法、好的事例，能够读者在轻松愉快环境中，快速掌握知识。其实，写一篇技术博客，表述你的思想，以此给人知识，也是一样道理。怎么样写好这篇博客，能够让读者轻松，愉快读完；又能收益，确实是门学问。以下是我一些观点，欢迎交流！</p>
<p><strong>1. 技术博客，站到读者角度去写</strong></p>
<p>技术类博客很常见，或是教大家某些软件、工具使用；或是分享自己经验；或是某次成长过程。我们会发现，现在教程很多，但是好的教程很少。 能够被大家推为佳作的就更少了。 要写好一篇教程，并不是傻瓜型，从头到尾逐步教读者实现就好。我想作为博主，你首先需要考虑，读者将是什么样群体，他们存在问题什么样，所掌握知识是哪些。 你如果抓住读者心里，知道他所急需要什么，而且用他能够理解的语言来表述，基本上成功了一大半了。</p>
<p><strong>2.技术博客，注意由浅入深</strong></p>
<p>一本好的技术书，销量能够上百万册，为什么会达到这样效果。除了书内容切合读者，另外一个方面，他能够让读者从中学习不断提升。在将一门技术时候，不是你一下子挖多深，然后就把读者怔住了，他膜拜你！这跟看电影不同，现在很多电影，一过来加很多很多悬念，让观影的人，一直想看结果。看书与看电影不同，看电影是消遣意义更多。而读一本技术书，跟多的是要了解，让后为己用。 这时，我们引入问题，可以跟多来自日常生活中的实例。记得当时看一本设计模式的书！里面讲为什么要用面向对象设计方法，就说中国的活字印刷。把所有文字做成一个一个字模， 以后要出书，就可以挑选文字，自由组合。如果中间有错误字，只需要把那个字模替换掉。马上有可以印刷。他主要说，面向对象让程序：易用性，扩展性，稳定性增强。 这个小小比方，大家一看就明了，而且不容易忘记。所以，当你讲一个很复杂问题时候，多联系实际，最好能够用大家见得到，摸得着的现实生活例子来打比方。 逐步深入！</p>
<p><strong>3.图文并茂</strong></p>
<p>这是我的弱项，可能是理工科原因，对于做精美图片不是很有兴趣。 但是，经常看到别人一些好的文档，好的图形介绍，真的是膜拜！ 经常有句话是：一图顶千言，有图有真相！ 有时候，你转弯抹角去表述一个实物，不如一张实际图来得快。 整好的架构图，部署图等，对于表述自己的意图很重要。 还可以让你排版变得更美观。不会让读者太沉闷！</p>
<p><strong>4.有整体大纲思路图</strong></p>
<p>你在表述一段文字前，最好是先告诉读者，你将要做什么。一句话介绍你的目的。 读者会带着这样一个框去读，当遇到一些问题，他可以联系到你框架去思考。能够快速掌握。 当然，你的一篇文档，最好在刚开始，告诉读者，你将从什么方面开始讲，接住做什么。 让读者能够首先整体把握大体思路。 不至于大段文字，把读者弄得晕头转向！</p>
<p>&#160;</p>
<p>好了，我经常去图书室看书，也经常分享自己的一些知识。 以上来自我的总结，有更好建议，意见欢迎讨论！</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chacuo.net/27.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>《我的博客》之新技术人员写博客好处</title>
		<link>http://blog.chacuo.net/10.html</link>
		<comments>http://blog.chacuo.net/10.html#comments</comments>
		<pubDate>Wed, 22 May 2013 04:31:53 +0000</pubDate>
		<dc:creator>程默</dc:creator>
				<category><![CDATA[学习心得]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://blog.chacuo.net/?p=10</guid>
		<description><![CDATA[技术人员写个博客很必要 其实我从事互联网已经很多年了，从论坛到博客，到微博，到现在的微信。我都经历过，这类程序 [...]]]></description>
				<content:encoded><![CDATA[<ul>
<li>
<h3><strong>技术人员写个博客很必要</strong></h3>
</li>
</ul>
<p>其实我从事互联网已经很多年了，从论坛到博客，到微博，到现在的微信。我都经历过，这类程序看过很多，写过不少；从实现技术，开发原理都有所了解。但始终我没有一个自己的博客，好比天天在外面建房子的人，没有一个自己的房子一样。总认为，建个博客没有多大必要，也没有时间去打理。直到后来，工作久了，接触东西多了，而更重要是，老是开始忘记东西，忘记以前所学习东西，很熟悉的知识也逐渐模糊了。开始觉得，应该要多动笔，记录下。 下次忘记了，有个地方能够找到！</p>
<ul>
<li>
<h3><strong>写博客好处</strong></h3>
</li>
</ul>
<p>开始带团队了，开始培养新人了。 我也开始跟同人说，作为技术人员应该有个自己的博客。</p>
<p>1. <strong>记录学习知识</strong>，这类也是很常见的，很多技术人员博客，最初都是以摘要，转载为主。 作为一个流水账，记录零碎的知识点。把所有看到，听到的，学习到的，汇总起来，日后要使用时候，可以慢慢翻阅！这类形式，很随意，基本上对于积累知识，开阔眼界有很大帮助，但是很多知识，只是转载抄来，很容易忘记。</p>
<p>2.&#160; <strong>总结知识点，做心得体会 </strong>这类文章，来自自己的亲身经历的成功、失败的项目。通过分析，总结其中原因，找到问题关键所在。 在分析、总结、归纳后，很容易接近事情的本质，找到真实原因。&#160; 这类博客无论给读者，还是自己，都会带来很大收获。自己总结出问题本质，以后类似问题，基本不会出现错误；对于读者而言，可能作者分享事务，即将是自己所要经历的，或者也经历过的，会有一种 豁然开朗感觉！</p>
<p>3. <strong>结交朋友 </strong>特别是做IT行业，基本上技术更新很快，自己经常写写博客，分享想心得。 时间常了，经常会有一些固定朋友来光顾。线上线下可能都会有互动。 沟通聊天，了解行业动态，提升技术方面眼界。 同时，自己人脉也会得到提升！</p>
<p>4.<strong>其它 </strong>说不定，写多了，就成为行业名人了。 慕名而来的人越来越多，各种效应可能都会产生。 也说不好，成为了更大企业所物色的对象！^_^</p>
<p>记得看过一个节目说，一个人看完一本书，过了2周左右，基本忘得只剩下10%了，但是如果看完一本书，然后做好记录，大概可以记录到20%左右。 如果，做好记录后，跟其它人讲解，跟其它人分享传授。这个时候，会发现能够2周后记住30%以上，而且很久时间，还能记得很多，忘记速度会减慢！</p>
<p>不要怕自己分享总结东西被其它人所掌握，你写的东西越好，自身所需要掌握提升的也会更多，你可能技术积累到飞跃之间所需要时间越短！看过很多名家博客，人气旺的，现在很多都是在有名气的大公司了。 博客好了，不光读者多了，可能物色自己的企业更多了。 ^_^</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chacuo.net/10.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
