背景
别人可以不用Google搜索,但是程序员必须得用。编程上无论是什么问题,Google总能以令人惊叹的准确率在前几条搜索结果中为你找到答案,这是其他的搜索引擎做不到的。但是由于众所周知的原因,哪怕是搜索"HRESULT"这种完全不敏感的关键字-你的浏览器也有可能会显示“链接被重置”,或者在搜索结果出来之后,点击某个结果却显示“链接被重置”。
这时候别人可以选择等待,但是对程序员来说,时间太宝贵了。这篇文章介绍在搜索结果已经出来,但链接却点击不开的情况下(也就是上段中标蓝的那一种现象),如何快速地打开链接。我希望有一天我们的后辈程序员将以为"链接被重置"只是个传说。
分析被重置的链接的URL
Google的搜索结果的链接地址中包含有"google"字样。比如,搜索"HResult",搜索到的其中一条结果(MSDN的 Exception.HResult Property)的链接地址为
由于这个地址中-我们暂且称其为(Google url)有"google", 所以“链接被重置”。
从这个google url中是可以提取出原始页面的地址的,也即http://msdn.microsoft.com/en-us/library/system.exception.hresult(v=vs.71).aspx;如果在浏览器中直接输入这个原始页面的地址,那么链接是不会被重置的。
原始页面的地址在Google url中以"&url="开始,到下一个"&"符号("&"符号在url中用来分隔参数)结束。其中包含一些转义符号,如用"%2F"表示'/',用"%3A"表示':', 更多的转义规则请参见Wikipedia:URL percent encoding。那么,要打开被重置的链接,只要取得链接的Google url, 取出"&url="和下一个"&"符号之间的字符串,并还原转义字符就可以得到原始的地址,将原始的地址用一个新窗口打开就可以了。
快速地打开
为了符合用户的使用习惯,最好将打开被重置链接的操作做到鼠标右键菜单中。如下图所示,
IE提供的一个功能是允许用户通过修改注册表的方式添加自定义的右键菜单项,同时指定点击该菜单项时运行的程序或脚本。
一下介绍添加这个右键菜单项的两个步骤。
步骤
1. 修改注册表,生成"GoogleURL"菜单项。(更详细的步骤请参加Adding Entries to the Standard Context Menu)
a. 打开注册表项HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt\
b. 新建一个子项GoogleURL (或者你喜欢的别的名称, 下图中的&GoogleURL设定G键为快捷键)
c. GoogleURL的(Default)值设为执行脚本的路径,我将其设为"H:\GoogleURL.htm"
d. 给GoogleURL添加一个类型为REG_DWORD的值,名称为Contexts,并将其值设为0x20 (十进制为32),这个值表示右键点击页面的控件时(如hyperlink)时GoogleURL这一项会在右键菜单中出现。
2. 编辑执行脚本(即步骤1中的H:\GoogleURL.htm)
a. 打开notepad.exe
b. 输入如下javascript脚本
c. 将脚本保存至H:\GoogleURL.htm
<script language="JavaScript">
var parentwin = external.menuArguments;
var doc = parentwin.document;
//get the "Google url" of the blocked hyperlink
var str = new String(doc.activeElement.href);
if(0 < str.length)
{
var originalurl = str;
//get the original URL, which is between "&url=" and the next ocurrance of '&'
var nStart = str.indexOf("&url=");
var nEnd = str.indexOf('&', nStart + 5);
if (nStart != -1 && nEnd != -1)
{
originalurl = str.substring(nStart + 5, nEnd);
}
//Deal with the Percent-encoding characters,
//Note that 'g' is required in order to perform global replacing- an annoying 'feature' of javascript
originalurl = originalurl.replace(/%3A/g, ':').replace(/%2F/g, '/');
//Open "clean" url in a new window
window.open(originalurl, "_blank");
}
</script>
值得一提的
这是我第一次写javascript,所以有经验的读者请指出其中的错误,或者能给我提供更正后的代码,我会更新。
另外在处理URL转义字符时,我只处理了':'和'/',但是其他的字符也是有可能用百分号来表示的,只是我还没有遇到。