通过16小时的努力,终于写出了“搜狗浏览器书签排序”的程序,开发环境:ubuntu10.4 apache php
思路:
1.搜狗浏览器书签是xml文件,格式诸如:
<item IsFolder="1" name="将来有用" addtime="2010-02-05 10:12:48">
<
item IsFolder
="
0
"
name
="
sqlserver中有类似于split方法吗
"
addtime
="
2010-02-05 10:11:58
">
http://topic.csdn.net/u/20100204/18/15167893-670b-49c1-9a95-a44e26a2af4c.html?14390
</
item
>
<
item IsFolder
="
0
"
name
="
outline sorting - Google 搜索
"
addtime
="
2010-08-18 08:59:41
">
http://www.google.com.hk/search?hl=zh-CN&newwindow=1&safe=strict&q=outline+sorting&btnG=Google+%E6%90%9C%E7%B4%A2&aq=f&aqi=&aql=&oq=&gs_rfai=
</
item
>
<
item IsFolder
="
0
"
name
="
商城特价 波斯顿男士香水LOST迷失男香30ml绿叶调植物清香-淘宝网
"
addtime
="
2010-09-27 00:24:25
">
http://item.taobao.com/item.htm?id=4508909983
</
item
>
</
item
>
<item IsFolder="0" name="进程关系之进程组、会话和控制终端_notebook_linux的空间_百度空间" addtime="2010-11-16 14:09:31">http://hi.baidu.com/ntbk/blog/item/2055dcbc75131a0119d81fca.html</item>
IsFolder=1标明这个节点是个文件夹,IsFolder=0标明这个节点是普通的书签;当前我的配置是文件夹按照名称排序(因为这样比较好找),书签按照最近添加时间(一来是因为新添加的书签一般是自己比较关注的,而来方便整理陈年的书签)。name是书签名称。addtime是书签添加的时间。书签对<item>url</item>中的url就是该书签对应的实际网址。
2.由于鄙人受php-xml能力的有限,使用了下面的设计方式,望莫怪。
3.php正则表达式修改xml文件格式如下:
<item IsFolder="1" name="将来有用" addtime="2010-02-05 10:12:48">
<
item IsFolder
="
0
"
name
="
sqlserver中有类似于split方法吗
"
addtime
="
2010-02-05 10:11:58
" url="
http://topic.csdn.net/u/20100204/18/15167893-670b-49c1-9a95-a44e26a2af4c.html?14390">
</
item
>
<
item IsFolder
="
0
"
name
="
outline sorting - Google 搜索
"
addtime
="
2010-08-18 08:59:41
" url="
http://www.google.com.hk/search?hl=zh-CN&newwindow=1&safe=strict&q=outline+sorting&btnG=Google+%E6%90%9C%E7%B4%A2&aq=f&aqi=&aql=&oq=&gs_rfai=">
</
item
>
<
item IsFolder
="
0
"
name
="
商城特价 波斯顿男士香水LOST迷失男香30ml绿叶调植物清香-淘宝网
"
addtime
="
2010-09-27 00:24:25
" url="
http://item.taobao.com/item.htm?id=4508909983">
</
item
>
</
item
>
<item IsFolder="0" name="进程关系之进程组、会话和控制终端_notebook_linux的空间_百度空间" addtime="2010-11-16 14:09:31" url="http://hi.baidu.com/ntbk/blog/item/2055dcbc75131a0119d81fca.html"></item>
即将网址移到item内部,作为属性,而节点非值(为了simplexmldocument读取)。
4.使用simplexml加载修改过的xml书签文件(因为simplexml对层次比较直观,通过children()可以获取子层)。
5. 获取一层item,就排序一次;
排好一层后,用new DOMDocument('1.0','UTF-8'); 创建新的xml对象 ,保存该层数据(以搜狗浏览器书签的的格式);
对于IsFolder=1的再对其子层进行排序。。。。
6. 完成思路及算法。
操作顺序:
1.导出书签xml文件
2.配置脚本文件 conf.inc.php 。主要涉及 排序规则,原始书签xml路径名,排好序的书签xml路径名
3.访问执行页面,鄙人的是http://localhost:8080/xml4.php
4.导入新书签xml文件 到浏览器即可。
以下为两个脚本文件:
1.配置文件 conf.inc.php :
<?php
define("FOLDIERFIRST",1); //文件夹 排在 书签 前面
define("BOOKMARKFIRST",2); //书签 排在 文件夹 前面
define("SNAME",3); //按照名称排序
define("SDATETIME",4); //按照时间排序
define("UP",1); //正序
define("DOWN",-1); //倒序
$CONF = array(
'FILE' => array( 'source'=>"/mnt/hgfs/ubuntu_share/others/BackupSource.xml", //搜狗浏览器导出的书签xml文件
'dest' =>"/mnt/hgfs/ubuntu_share/others/BackupDest.xml"), //经过排序的新书签xml文件
'FOLDIERORBOOKMARK' => array( 'type' =>FOLDIERFIRST, 'direction'=>DOWN,),
//FOLDIERFIRST:同一层次中文件夹排在书签前面,DOWN:倒序
'FSORT' => array( 'type' =>SNAME, 'direction'=>UP,),
//对于文件夹,按照名称排序SNAME,升序UP
'BSORT' => array( 'type' =>SDATETIME, 'direction'=>DOWN,),
//对于书签,按照提那家日期排序SDATETIME,降序DOWN
);
?>
define("FOLDIERFIRST",1); //文件夹 排在 书签 前面
define("BOOKMARKFIRST",2); //书签 排在 文件夹 前面
define("SNAME",3); //按照名称排序
define("SDATETIME",4); //按照时间排序
define("UP",1); //正序
define("DOWN",-1); //倒序
$CONF = array(
'FILE' => array( 'source'=>"/mnt/hgfs/ubuntu_share/others/BackupSource.xml", //搜狗浏览器导出的书签xml文件
'dest' =>"/mnt/hgfs/ubuntu_share/others/BackupDest.xml"), //经过排序的新书签xml文件
'FOLDIERORBOOKMARK' => array( 'type' =>FOLDIERFIRST, 'direction'=>DOWN,),
//FOLDIERFIRST:同一层次中文件夹排在书签前面,DOWN:倒序
'FSORT' => array( 'type' =>SNAME, 'direction'=>UP,),
//对于文件夹,按照名称排序SNAME,升序UP
'BSORT' => array( 'type' =>SDATETIME, 'direction'=>DOWN,),
//对于书签,按照提那家日期排序SDATETIME,降序DOWN
);
?>
2.执行页面文件 xml4.xml :
<?php
require_once("conf.inc.php");
$sourcefile = $CONF['FILE']['source'];
$destfile = $CONF['FILE']['dest'];
require_once("conf.inc.php");
$sourcefile = $CONF['FILE']['source'];
$destfile = $CONF['FILE']['dest'];
funcMakeURL($sourcefile);
//the main operation
//{
$xml = simplexml_load_file($sourcefile.".xml") or die("Canot open then file:<br/> $file");
$doc = new DOMDocument('1.0','UTF-8');
$doc->formatOutput = true;
$root = $doc->createElement("main");
$root = $doc->appendChild($root);
$name = $doc->createAttribute('version');
$root->appendChild($name);
$value = $doc->createTextNode(2);
$name->appendChild($value);
//the main operation
//{
$xml = simplexml_load_file($sourcefile.".xml") or die("Canot open then file:<br/> $file");
$doc = new DOMDocument('1.0','UTF-8');
$doc->formatOutput = true;
$root = $doc->createElement("main");
$root = $doc->appendChild($root);
$name = $doc->createAttribute('version');
$root->appendChild($name);
$value = $doc->createTextNode(2);
$name->appendChild($value);
$x = array('loc'=>$root,'item'=>$xml);
mainSort($root,$x);
echo "Saving all the document:<br/>";
$doc->save($destfile);
echo "succeffully at ".date('Y-m-d H:i:s');
die(1);
//}
//}
function funcMakeURL($sourcefile)
{
{
$content = "";
$fd = fopen($sourcefile,'r');
while(!feof($fd))
{
$content.= fgets($fd,4096);
}
$fd = fopen($sourcefile,'r');
while(!feof($fd))
{
$content.= fgets($fd,4096);
}
$pattern = '/(<item/s+)(.*?)(>http)(.*?)[^/"](<//item>)[^/"]/e';
$content = preg_replace($pattern,"addURL('//1','//2','//3','//4','//5')",$content);
$content = preg_replace($pattern,"addURL('//1','//2','//3','//4','//5')",$content);
$fdw = fopen($sourcefile.".xml",'w');
fwrite($fdw,$content);
fclose($fdw);
fclose($fd);
echo("make url inner item ok.<br/>");
}
fwrite($fdw,$content);
fclose($fdw);
fclose($fd);
echo("make url inner item ok.<br/>");
}
function addURL($str1,$str2,$str3,$str4,$str5)
{
return preg_replace('/"/','"',$str1).
preg_replace('/"/','"',$str2).
" url=/"".substr($str3,1,strlen($str3)-1)."$str4/">$str5";
}
function mainSort($parent,$xml)
{
{
return preg_replace('/"/','"',$str1).
preg_replace('/"/','"',$str2).
" url=/"".substr($str3,1,strlen($str3)-1)."$str4/">$str5";
}
function mainSort($parent,$xml)
{
$itemlist = sortBase($xml);
$itemlist = addItem($parent,$itemlist);
$itemlist = addItem($parent,$itemlist);
foreach($itemlist as $item)
{
if( intval($item["item"]["IsFolder"]) == 1)
{
triSort($item["loc"],$item);
}
}
}
{
if( intval($item["item"]["IsFolder"]) == 1)
{
triSort($item["loc"],$item);
}
}
}
function triSort($parent,$xml)
{
{
$itemlist = triSortBase($xml);
$itemlist = addItem($parent,$itemlist);
$itemlist = addItem($parent,$itemlist);
foreach($itemlist as $item)
{
if( intval($item["item"]["IsFolder"]) == 1)
{
triSort($item["loc"],$item);
}
}
}
{
if( intval($item["item"]["IsFolder"]) == 1)
{
triSort($item["loc"],$item);
}
}
}
function triSortBase($xml)
{
$list = array();
foreach($xml["item"]->children() as $item)
{
$IsFolder = $item["IsFolder"];
$itemname = $item["name"];
$addtime = $item["addtime"];
$key = md5("$IsFolder$itemname$addtime");
{
$list = array();
foreach($xml["item"]->children() as $item)
{
$IsFolder = $item["IsFolder"];
$itemname = $item["name"];
$addtime = $item["addtime"];
$key = md5("$IsFolder$itemname$addtime");
$list[$key] = array('loc'=>null,'item'=>$item);
}
}
usort($list,"myCompare");
return $list;
}
return $list;
}
function sortBase($xml)
{
$list = array();
foreach($xml["item"]->children() as $item)
{
$IsFolder = $item["IsFolder"];
$itemname = $item["name"];
$addtime = $item["addtime"];
$key = md5("$IsFolder$itemname$addtime");
{
$list = array();
foreach($xml["item"]->children() as $item)
{
$IsFolder = $item["IsFolder"];
$itemname = $item["name"];
$addtime = $item["addtime"];
$key = md5("$IsFolder$itemname$addtime");
$list[$key] = array('loc'=>null,'item'=>$item);
}
}
usort($list,"myCompare");
return $list;
}
return $list;
}
function myCompare($a,$b)
{
global $CONF;
$type1 = intval($a["item"]["IsFolder"]);
$type2 = intval($b["item"]["IsFolder"]);
{
global $CONF;
$type1 = intval($a["item"]["IsFolder"]);
$type2 = intval($b["item"]["IsFolder"]);
//folder
if($type1==1 && $type2 == 1)
{
switch($CONF['FSORT']['type'])
{
case SNAME:
return nameCompare($a,$b,$CONF['FSORT']['direction']);break;
case SDATETIME:
return dtCompare($a,$b,$CONF['FSORT']['direction']);break;
}
}else if($type1==0 && $type2 == 0)
//bookmark
{
switch($CONF['BSORT']['type'])
{
case SNAME:
return nameCompare($a,$b,$CONF['BSORT']['direction']);break;
case SDATETIME:
return dtCompare($a,$b,$CONF['BSORT']['direction']);break;
}
}
//folder and bookmark
{
if($CONF['FOLDIERORBOOKMARK']['type']==FOLDIERFIRST)
return $type1>$type2?-1:1;
else
return $type1>$type2?1:-1;
}
}
function nameCompare($a,$b,$direction)
{
$str1 = $a["item"]["name"];
$str2 = $b["item"]["name"];
if($type1==1 && $type2 == 1)
{
switch($CONF['FSORT']['type'])
{
case SNAME:
return nameCompare($a,$b,$CONF['FSORT']['direction']);break;
case SDATETIME:
return dtCompare($a,$b,$CONF['FSORT']['direction']);break;
}
}else if($type1==0 && $type2 == 0)
//bookmark
{
switch($CONF['BSORT']['type'])
{
case SNAME:
return nameCompare($a,$b,$CONF['BSORT']['direction']);break;
case SDATETIME:
return dtCompare($a,$b,$CONF['BSORT']['direction']);break;
}
}
//folder and bookmark
{
if($CONF['FOLDIERORBOOKMARK']['type']==FOLDIERFIRST)
return $type1>$type2?-1:1;
else
return $type1>$type2?1:-1;
}
}
function nameCompare($a,$b,$direction)
{
$str1 = $a["item"]["name"];
$str2 = $b["item"]["name"];
if($str1 == $str2)
return 0;
return intval(strcasecmp($str1,$str2)) * intval($direction) ;
}
return 0;
return intval(strcasecmp($str1,$str2)) * intval($direction) ;
}
function dtCompare($a,$b,$direction)
{
$str1 = $a["item"]["addtime"];
$str2 = $b["item"]["addtime"];
{
$str1 = $a["item"]["addtime"];
$str2 = $b["item"]["addtime"];
if($str1 == $str2)
return 0;
return strcasecmp($str1,$str2) * intval($direction) ;
}
return 0;
return strcasecmp($str1,$str2) * intval($direction) ;
}
function addItem($parent,$itemlist)
{
global $doc;
global $xml;
{
global $doc;
global $xml;
$list = array();
foreach($itemlist as $item)
{
{
$IsFolder = $item["item"]["IsFolder"];
$itemname = $item["item"]["name"];
$addtime = $item["item"]["addtime"];
$url = $item["item"]["url"];
$itemname = $item["item"]["name"];
$addtime = $item["item"]["addtime"];
$url = $item["item"]["url"];
$bookmark = $doc->createElement("item");
$bookmark = $parent->appendChild($bookmark);
$item["loc"]= $bookmark;
$name = $doc->createAttribute("IsFolder");
$bookmark->appendChild($name);
$value = $doc->createTextNode($IsFolder);
$name->appendChild($value);
$name = $doc->createAttribute('name');
$bookmark->appendChild($name);
$value = $doc->createTextNode($itemname);
$name->appendChild($value);
$bookmark = $parent->appendChild($bookmark);
$item["loc"]= $bookmark;
$name = $doc->createAttribute("IsFolder");
$bookmark->appendChild($name);
$value = $doc->createTextNode($IsFolder);
$name->appendChild($value);
$name = $doc->createAttribute('name');
$bookmark->appendChild($name);
$value = $doc->createTextNode($itemname);
$name->appendChild($value);
$name = $doc->createAttribute('addtime');
$bookmark->appendChild($name);
$value = $doc->createTextNode($addtime);
$name->appendChild($value);
$bookmark->appendChild($name);
$value = $doc->createTextNode($addtime);
$name->appendChild($value);
$urlnode = $doc->createTextNode($url);
$bookmark->appendChild($urlnode);
$bookmark->appendChild($urlnode);
$list[] = $item ;
}
}
return $list;
}
?>
}
?>
两张图片实际为xml文件:
http://hi.csdn.net/attachment/201011/26/0_1290787510kCsW.gif 是conf.inc.php
http://hi.csdn.net/attachment/201011/26/0_12907875418030.gif 是xml4.php
请下载改名称即可。