<?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>-Flyぁ梦- &#187; 正则</title>
	<atom:link href="http://blog.11034.org/tag/%e6%ad%a3%e5%88%99/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.11034.org</link>
	<description></description>
	<lastBuildDate>Sun, 22 Jun 2025 08:59:05 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.2.38</generator>
	<item>
		<title>各大视频网站的视频截图抓取</title>
		<link>http://blog.11034.org/2012-06/get_video_cover_image.html</link>
		<comments>http://blog.11034.org/2012-06/get_video_cover_image.html#comments</comments>
		<pubDate>Thu, 28 Jun 2012 15:09:08 +0000</pubDate>
		<dc:creator><![CDATA[-Flyぁ梦-]]></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[截图]]></category>
		<category><![CDATA[正则]]></category>
		<category><![CDATA[视频]]></category>

		<guid isPermaLink="false">http://blog.stariy.org/?p=1167</guid>
		<description><![CDATA[新的一个项目，要有视频的功能，当然只是简单的贴URL和标题罢了，不会涉及到要去上传视频文件，但是在展示视频的时 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>新的一个项目，要有视频的功能，当然只是简单的贴URL和标题罢了，不会涉及到要去上传视频文件，但是在展示视频的时候就需要用到视频截图了，自己去生成截图难度太大了也不现实，去视频的源网站抓取是可行也比较方便的方法。</p>
<p>试过优酷、土豆、酷6、56、腾讯、新浪、搜狐这些国内最大的视频门户，基本都成功获取到截图，其中属优酷最麻烦。</p>
<p><span id="more-1167"></span></p>
<h3>优酷</h3>
<p>感觉优酷不愧为国内第一视频门户吧，技术算是最成熟的，安全也做得最好，直接体现在获取它的视频截图真心不容易。用查看html源码的方式根本无法实现，用firebug等工具找图片也不行因为图片是在flash里的。不过网上已经有文章告诉了方法，自己也可以通过httpfox或chrome自带的Network工具查看发起的http请求去找图片地址，优酷通过向URL：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #0000ff;">'http://v.youku.com/player/getPlayList/VideoIDS/视频的ID/version/5/source/out'</span></pre></td></tr></table></div>

<p>而视频的ID就是普通视频URL中id_xxx中的xxx串，URL返回一段json字符串，其中的logo字段就是图片地址，可以发现此图片地址也是一个动态请求，非常复杂。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$url</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'http://v.youku.com/v_show/id_XMTA0NTM2MzI4.html'</span><span style="color: #339933;">;</span>
<span style="color: #990000;">preg_match_all</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;/id\_(\w+)[\=|.html]/&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$url</span><span style="color: #339933;">,</span> <span style="color: #000088;">$matches</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$matches</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$id</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$matches</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$u</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'http://v.youku.com/player/getPlayList/VideoIDS/'</span><span style="color: #339933;">.</span><span style="color: #000088;">$id</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'/version/5/source/out'</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$json_str</span> <span style="color: #339933;">=</span> <span style="color: #990000;">file_get_contents</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$u</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$json</span> <span style="color: #339933;">=</span> <span style="color: #990000;">json_decode</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$json_str</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$image_url</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$json</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>data<span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>logo<span style="color: #339933;">;</span>
	<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$image_url</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<h3>56</h3>
<p>类似优酷，请求url为http://vxml.56.com/json/视频ID/?src=out，视频ID也好辨别。//测试可行，此来源网络</p>
<h3>土豆、酷6、腾讯、新浪、搜狐</h3>
<p>这些都比较简单，打开html源码细心点就能找到image的url，用正则就可以抓取出来了。其中酷6比较麻烦，把url中的:和.都用unicode编码了，先用字符串匹配给转了回来再去正则，因为不知道正则字符串中怎么搞反斜杠=.=（\\不起作用咩&#8230;）</p>
<ul>
<li>土豆：开头的js代码中有个属性listData，里面放了5部视频的信息，选第一部，其中的pic属性，正则字符串：/,pic:\&#8221;([\w\/\.\:]+)\&#8221;/</li>
<li>酷6：Ctrl-F搜索bigpicpath属性，也在js代码中，正则字符串：/\&#8221;bigpicpath\&#8221;\:\&#8221;([\w\/\.\:]+)\&#8221;/</li>
<li>腾讯：pic属性，正则字符串：/pic \:\&#8221;([\w\/\.\:]+)\&#8221;/</li>
<li>新浪：pic属性，正则字符串：/pic\: \'([\w\/\.\:]+)\&#8217;/ 和楼上非常相似，难道又是抄袭？哈哈哈</li>
<li>搜狐：cover属性，正则字符串：/var cover=\&#8221;([\w\/\.\:]+)\&#8221;/</li>
</ul>
<p>在网上找资料的时候发现一个看似很好用的PHP的VideoUrlParser类，试了下只有优酷和56是起作用的，然后自己再用正则的办法把剩下的视频网站搞定。</p>
<p><a title="VideoUrlParser.class.origin" href="/wp-content/files/posts/2012-6-video-image-parser/VideoUrlParser.class.origin.php.text" target="_blank">原先的VideoUrlParser类</a></p>
<p><a title="VideoUrlParser.class" href="/wp-content/files/posts/2012-6-video-image-parser/VideoUrlParser.class.php.text" target="_blank">改良后VideoUrlParser类</a></p>
<h4  class="related_post_title">看看 截图 , 正则 , 视频</h4><ul class="related_post"><li>2012-05-15 -- <a target="_blank" href="http://blog.11034.org/2012-05/router_in_play_framework.html" title="Play框架的Router机制和jregex包">Play框架的Router机制和jregex包</a></li></ul><h4 class="related_post_title">看看 PHP </h4><ul class="related_post"><li>2012-07-03 -- <a target="_blank" href="http://blog.11034.org/2012-07/trie_in_php.html" title="敏感词过滤，PHP实现的Trie树">敏感词过滤，PHP实现的Trie树</a></li>]]></content:encoded>
			<wfw:commentRss>http://blog.11034.org/2012-06/get_video_cover_image.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Play框架的Router机制和jregex包</title>
		<link>http://blog.11034.org/2012-05/router_in_play_framework.html</link>
		<comments>http://blog.11034.org/2012-05/router_in_play_framework.html#comments</comments>
		<pubDate>Mon, 14 May 2012 16:23:37 +0000</pubDate>
		<dc:creator><![CDATA[-Flyぁ梦-]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Play]]></category>
		<category><![CDATA[框架]]></category>
		<category><![CDATA[正则]]></category>
		<category><![CDATA[路由]]></category>

		<guid isPermaLink="false">http://blog.stariy.org/?p=1154</guid>
		<description><![CDATA[最近对Play框架兴趣甚浓，对其有兴趣的功能都想一探究竟，先研究了下它的Router机制。概要地说，主要使用r [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>最近对Play框架兴趣甚浓，对其有兴趣的功能都想一探究竟，先研究了下它的Router机制。概要地说，主要使用routes文件和正则表达式来完成URL到函数的映射，不过这里正则表达式功能比较强可以解析出{id}这样的参数，因此Play使用了第三方jregex包而不是JDK的java.util.regex包来执行正则表达式的工作。<span id="more-1154"></span></p>
<p>Play的routes文件很清楚简单，每行一个Route，最重要的参数包含请求方式、请求URL和响应的函数，就像下面这一行：</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="java" style="font-family:monospace;">	GET	<span style="color: #339933;">/</span>customer<span style="color: #339933;">/</span>detail<span style="color: #339933;">/</span><span style="color: #009900;">&#123;</span>id<span style="color: #009900;">&#125;</span>	CustomerController.<span style="color: #006633;">detail</span></pre></td></tr></table></div>

<p>Router机制机制具体包含解析和路由2个阶段。路由代码主要在play.mvc.Router和其静态内部类Route，解析Request代码主要在play.mvc.ActionInvoker中。</p>
<h3>1.route文件的解析和路由表的建立</h3>
<ol>
<li>Play在启动初始化时，通过application.conf配置文件获取http.path参数，ctxPath = http.path;（这个就是相对路径啦）</li>
<li>调用Router.detectChanges(ctxPath);//若路由表没有建立或者routes文件被更新，解析文件</li>
<li>针对route文件的每一行（所以路由的顺序按照routes文件行的顺序为优先级），根据正则表达式获取method、path、action值，可能还有headers和params值</li>
<li>新建一条Route记录，并作一些解析计算（比如找出path中带有的参数信息）</li>
</ol>
<p>以上面提到那条示例的route为例，method = GET，path = /customer/detail/{id}，action = CustomerController.detail，在新建Route记录作解析计算时，会先将path利用正则表示式转化为/customer/detail/{&lt;[^/]+&gt;id}的形式，然后拿出所有的{id}形式的变量信息，再然后继续通过正则表达式再转化为</p>

<div class="wp_syntax"><table><tr><td class="code"><pre class="java" style="font-family:monospace;">	<span style="color: #339933;">/</span>customer<span style="color: #339933;">/</span>detail<span style="color: #339933;">/</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>id<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#91;</span><span style="color: #339933;">^/</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">+</span><span style="color: #009900;">&#41;</span></pre></td></tr></table></div>

<p>这样的形式，这也是path最后的pattern，用来去匹配请求的URL。这个形式的正则表达式，java.util.regex包无法解析，而jregex包是可以处理的，并且group的时候可以根据变量名来取变量值，很方便。</p>
<h3>2.URL的路由</h3>
<p>当一个Http请求过来，就遍历路由表，当一条Route记录可以匹配当前的path，就可以获得在routes文件中配置的action值，就比如上面的CustomerController.detail，并通过正则表达式获得路径中的参数（id=?）。然后解析action值得到Controller类名和Action方法名（action值若不以“controllers.”开头的话会被自动加上），通过Play框架中的ApplicationClassloader获取到Controller类的Class类，然后通过此Class类反射获取到具体Action的Method，将这些解析的结果都赋给play.mvc.Http的静态内部类Request中，URL路由就完成了。</p>
<h3>值得优化</h3>
<p>这样看来，其实这自定义URL的路由机制还是蛮简单的，如果去除了动态参数绑定、静态文件路由特判等一些特殊功能的话，那真的是很简单很容易实现了。而且感觉Play的路由代码还有很多可以值得优化：</p>
<ol>
<li>不带动态参数的路由路径（就是纯字符串匹配）可以通过HashMap来匹配，而不用每条都去执行一遍正则表达式</li>
<li>每条路由对应的Controller类和调用的Action Method应该在路由表建立的时候就应该被解析完毕并存储在路由表中，而不是每一个http请求都重新解析一遍</li>
</ol>
<h3>jregex包</h3>
<p>看Play源代码发现了这个包，官方网址：<a href="http://jregex.sourceforge.net/">http://jregex.sourceforge.net/</a>。网站上很好地比较了它与java.util.regex的优劣，用变量名去Group即网站上介绍的named groups，而且据它自己介绍性能比较高。觉得当一个应用大量用到正则表达式的话，jregex是比较推荐的。</p>
<p><strong><code>JRegex</code></strong> vs. <strong><code>java.util.regex</code></strong></p>
<ul>
<li>(+) JRegex is a Free Software</li>
<li>(+) JRegex is portable (runs under any version of java)</li>
<li>(+) JRegex supports more features (named groups, Perl5.6&#8217;s conditional statements and more)</li>
<li>(-) java.util.regex implements 2&#8217;d level of Unicode support (JRegex is level 1)</li>
<li>(-) JRegex is not a &#8216;standard&#8217; library</li>
</ul>
<h4  class="related_post_title">看看 Play , 框架 , 正则 , 路由</h4><ul class="related_post"><li>2012-05-15 -- <a target="_blank" href="http://blog.11034.org/2012-05/param_binding_in_play_framework.html" title="Play框架中Action的参数绑定和验证">Play框架中Action的参数绑定和验证</a></li><li>2012-05-13 -- <a target="_blank" href="http://blog.11034.org/2012-05/java_play_framework.html" title="Java Play framework">Java Play framework</a></li><li>2012-06-28 -- <a target="_blank" href="http://blog.11034.org/2012-06/get_video_cover_image.html" title="各大视频网站的视频截图抓取">各大视频网站的视频截图抓取</a></li></ul><h4 class="related_post_title">看看 Java </h4><ul class="related_post"><li>2016-09-09 -- <a target="_blank" href="http://blog.11034.org/2016-09/64bits_linux_arena_memory.html" title="64位Linux下Java进程堆外内存迷之64M问题">64位Linux下Java进程堆外内存迷之64M问题</a></li><li>2016-08-18 -- <a target="_blank" href="http://blog.11034.org/2016-08/java_concurrency_in_practice.html" title="读java concurrency in practice">读java concurrency in practice</a></li><li>2016-08-05 -- <a target="_blank" href="http://blog.11034.org/2016-08/thread_stop.html" title="线程清理">线程清理</a></li><li>2016-06-21 -- <a target="_blank" href="http://blog.11034.org/2016-06/futuretask.html" title="FutureTask简单分析和用法">FutureTask简单分析和用法</a></li><li>2016-06-21 -- <a target="_blank" href="http://blog.11034.org/2016-06/semaphore.html" title="Semaphore简单分析">Semaphore简单分析</a></li>]]></content:encoded>
			<wfw:commentRss>http://blog.11034.org/2012-05/router_in_play_framework.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
