[ Content | Sidebar ]

javascript做html字符串的截断

二月 1st, 2010

2010.2.6 日修正
————————————
2010.2.3 日修正

<html>
<!-- html字符截断第二版 bug修正 + 2.6日修正-->
<script>
function sub_html_str(str, num)
{
    var reg = new RegExp( '<[^>]+>' , 'g' );
    var rt, rts = [], indexs = [], tstr, endstr, rstr, sstr, endtag, rtstr;
 
    //提取所有的html标签和标签在字符串中的位置 
    while ( ( rt = reg.exec(str) ) != null )
    {
        rts.push(rt[0]);
        indexs.push(rt['index']);
    }
 
    //删除字符串中所有的html标签
    tstr = str.replace(reg, '');
    //对剩余的纯字符串进行substr
 
    sstr = tstr.substr(num, tstr.length);
    tstr = tstr.substr(0, num);
 
 
 
    //判断有没有把实体腰斩,如果有腰斩的就再接上 
    endstr = (/&[^&]*$/.exec(tstr) || '');
    if ( endstr !== '' ) endstr += '' + (/^[^;]*;/.exec(sstr) || '');
    if (/^(&\w{1,10};|&#\d+;)$/.test(endstr))
    {
        rtstr = tstr.replace(/&[^&]*$/, endstr);
    }
    else
    {
        rtstr = tstr;
    }
 
    //把html标签放回到截断完毕的字符串中,当然有的html标签这时候已经无家可归了
 
    var index = 0;
 
    for (var i = 0; i < rts.length; i ++)
    {
        index = indexs[i];
        if (rtstr.length >= index)
        {
            rtstr = rtstr.substr(0, index) + rts[i] + rtstr.substr(index, rtstr.length);
        } 
        else
        {
            break;
        }
    }
    var lastindex = i ;
    //下面的代码用来闭合没有闭合的标签
    tstr = rtstr;
    rstr = '';
 
    //把闭合的标签全部删除,sstr包含了没有闭合的标签
    while ( rstr != tstr )
    {
        rstr = tstr;
        tstr = tstr.replace(/<[^\/][^>]*>[^<]*<\/[^>]+>/g, '').replace(/<[^>]+ \/>/g, '');
    }
    sstr = tstr;
    //在剩余的部分查找没有闭合的标签
    tstr = str.replace(rtstr, '');
    rstr = '';
    while ( rstr != tstr )
    {
        rstr = tstr;
        tstr = tstr.replace(/<[^\/][^>]*>[^<]*<\/[^>]+>/g, '').replace(/<[^>]+ \/>/g, '');
    }
 
    reg.lastIndex = 0;
    var endreg = new RegExp('<\/[^>]+>', 'g');
    //如果存在没有闭合的标签,从无家可归的标签里找下半身
    while ( reg.exec(sstr) != null ) 
    {
        if ( (rt = endreg.exec(tstr)) != null)
        {
             rtstr += rt[0];
        }
        else
        {
             break;
        }
    }
 
    return rtstr;
}
</script>
<script>
document.writeln('<textarea cols="100" rows="10">');
document.writeln(sub_html_str('<xx><oo>嵌套标签截断测试</oo><fk><test>lala</test></fk></xx>', 5));
document.writeln(sub_html_str('正常字符串测试', 5));
document.writeln(sub_html_str('<xx>带标签的字符串截断</xx>', 5));
document.writeln(sub_html_str('<xx><oo>嵌套标签截断测试</oo><fk>lala</fk></xx>', 5));
document.writeln(sub_html_str('<xx><oo>嵌套标签<img src="http://www.google.com/logo.gif" />截断测试</oo></xx>', 5));
document.writeln(sub_html_str('<xx><oo>实体截断&nbsp;测试测试</oo></xx>', 5));
document.writeln('</textarea>');
</script>
 
</html>
Copy Code | Run Code

——————————————————–
最近各位弟兄都很忙的样子,俺则已经沦为做活动页面的了。。html字符的截断一般都会放到后台技术们做,但是春节的这个东西比较紧,偶就前端代劳一下。
运气不错,这么长的函数没调几次就过了。也是按照自己的思路来。。。
这个函数仅能做到

  • 截取除了html标签之外的前n个字符,一般的需求都是这样的。。
  • 不会截断html实体
  • 查找并闭合被截断的html标签,但是如果给的html就存在没有闭合的就不管了
<html>
<!-- html字符截断第一版 -->
<script>
function sub_html_str(str, num)
{
    var reg = new RegExp( '<[^>]+>' , 'g' );
    var rt, rts = [], indexs = [], tstr, endstr, rstr, endtag;
 
    //提取所有的html标签和标签在字符串中的位置 
    while ( ( rt = reg.exec(str) ) != null )
    {
        rts.push(rt[0]);
        indexs.push(rt['index']);
    }
 
    //删除字符串中所有的html标签
    str = str.replace(reg, '');
    //对剩余的纯字符串进行substr
    tstr = str.substr(0, num);
 
    //判断有没有把实体腰斩,如果有腰斩的就再接上 
    endstr = (/&[^&]*$/.exec(tstr) || '');
    if ( endstr !== '' ) endstr += '' + (/^[^;]*;/.exec(str.substr(num, str.length)) || '');
    if (/^(&\w{1,10};|&#\d+;)$/.test(endstr))
    {
        str = tstr.replace(/&[^&]*$/, endstr);
    }
    else
    {
        str = tstr;
    }
 
    //把html标签放回到截断完毕的字符串中,当然有的html标签这时候已经无家可归了
 
    var index = 0;
 
    for (var i = 0; i < rts.length; i ++)
    {
        index = indexs[i];
        if (str.length >= index)
        {
            str = str.substr(0, index) + rts[i] + str.substr(index, str.length);
        } 
        else
        {
            break;
        }
    }
    var lastindex = i ;
    //下面的代码用来闭合没有闭合的标签
    tstr = str;
    rstr = '';
 
    //把闭合的标签全部删除,tstr包含了没有闭合的标签
    while ( rstr != tstr )
    {
        rstr = tstr;
        tstr = tstr.replace(/<[^>]+>[^<]*<\/[^>]+>/g, '').replace(/<[^>]+ \/>/g, '');
    }
 
    reg.lastIndex = 0;
    //如果存在没有闭合的标签,从无家可归的标签里找下半身
    while ( reg.exec(rstr) != null ) 
    {
        while ( lastindex < rts.length )
        {
            endtag = rts[lastindex];
            //如果它是一个用来闭合的标签,就把它追加到字符串
            if ( /^<[ ]*\//.test(endtag) ) 
            {
                str = str + endtag;
                lastindex ++;
                break;
            }
            //如果它是自闭合的标签
            else if ( /<[^>]+ \/>/.test(endtag) )
            {
                lastindex ++;
            }
            //如果它是一个起始标签
            else
            {
                lastindex += 2;
            }
 
        }
    }
 
    return str;
}
</script>
<script>
document.writeln('<textarea cols="100" rows="10">');
document.writeln(sub_html_str('正常字符串测试', 5));
document.writeln(sub_html_str('<xx>带标签的字符串截断</xx>', 5));
document.writeln(sub_html_str('<xx><oo>嵌套标签截断测试</oo><fk>lala</fk></xx>', 5));
document.writeln(sub_html_str('<xx><oo>嵌套标签<img src="http://www.google.com/logo.gif" />截断测试</oo></xx>', 5));
document.writeln(sub_html_str('<xx><oo>实体截断&nbsp;测试测试</oo></xx>', 5));
document.writeln('</textarea>');
</script>
 
</html>
Copy Code | Run Code

还原用户环境失败…

一月 29th, 2010

话说昨天采集了用户的系统和软件信息,今天用虚拟机还原了一个,但是失败了,bug没有重现~

过程还是挺费功夫的:
首先用户用的番茄花园xp sp2, 虚拟机里用迅雷秒杀了,超赞公司网速~
Virtualbox里系统装好,下面就是比较头疼的,按照补丁列表打补丁…

hualu@lu-hua:patch$ cat /tmp/allsofts.txt | grep -E "\(KB[0-9]{6}" | sed -e 's/.*(\(KB[^)]*\).*/\1/' | wc -l
138
Copy Code 

软件列表里一共有138个补丁, 对着列表在360卫士里挨个找着选的话估计我这老眼就废了…

还是自己写脚本去微软下载

#!/bin/sh
 
ID="$1"
if [ ! -n "$ID" ];then
    exit
fi
echo '-----------------------------------'
BASEURL='http://www.microsoft.com'
 
get_first_link()
{
   cat "$1" | grep "Windows XP" | grep "<a" | sed -e 's/.*href="\([^"]*\)".*/\1/' \
       -e 's/.*;u=//' \
       -e 's/%2f/\//g' \
       -e 's/%3f/\?/g' \
       -e 's/%3d/\=/g'
}
 
get_second_link()
{
    cat "$1" | grep 'id="quickCheck"' | sed -e "s/.*window\.open('\([^']*\)',.*/\1/"
}
 
url="${BASEURL}/downloads/results.aspx?pocId=7&freetext=${ID}&DisplayLang=zh-cn"
echo "${url}"
 
wget "${url}" -q -O /tmp/get_ms_link
 
surl="`get_first_link /tmp/get_ms_link`"
 
if [ ! -n "${surl}" ];then
    echo "${ID}补丁不存在"
    echo "${ID}" >> ./patch_not_found.txt
    exit
fi
 
surl="${BASEURL}${surl}"
echo "${surl}"
 
wget "${surl}" -q -O /tmp/get_ms_link
turl="`get_second_link /tmp/get_ms_link`"
echo "${turl}"
if [ ! -n "${turl}" ];then
    echo "${ID}补丁不存在"
    echo "${ID}" >> ./patch_not_found.txt
    exit
fi
 
wget "${turl}"
 
echo '-----------------------------------'
Copy Code 

不知道微软有没有专门的补丁下载入口,不过我还是模仿我知道的方法下载了,先搜索,然后结果里找,使用:sh get_ms_patch.sh KB975467

然后几个老套的命令

#取出所有补丁编号
cat allsofts.txt | grep -E "\(KB[0-9]{6}" | sed -e 's/.*(\(KB[^)]*\).*/\1/' > /tmp/allpatch.txt
#下载所有补丁
cat /tmp/allpatch.txt | xargs -i sh /home/hualu/bin/get_ms_update.sh "{}"
#生成批量安装补丁的批处理文件
find ./ -name "*.exe" | sort | xargs -i basename {} | xargs -i echo ".\{} /passive /norestart" >> install.bat
Copy Code 

回到虚拟xp里,挂在网络驱动,双击install.bat,开始安装… 等我吃完午饭,补丁都装完了,灰常激动,立刻重启,打开ie,登录淫淫,进入个人主页, fuck, 没有脚本错误!!!!

估计今天我嘴上的泡就是因为这个起的,真上火… , 后面,我接着按照软件列表装了瑞星,offcie 2007,均没有看到我期待的脚本错误

看来我得研究星座了…

收集windows xp的系统信息

一月 28th, 2010

最近又遇到了一个不是所有的IE6浏览器都会有的bug,于是今天去一个用户家里上门debug,这已经是第二次了,学乖了一点,提前查了以下收集系统信息的方法

1 . 主要信息

一个cmd命令就可以了

systeminfo > system.txt
Copy Code 

2 . 安装的所有软件和补丁列表

搜到一个老外写的vbscript脚本 : InstalledPrograms

恩,有了这两个列表,就可以用来重现一个用户类似的环境~

ubuntu下mpd+mpc的安装配置

一月 27th, 2010

今天大学的一个哥们说在ubuntu下面mpd一直配不好,俺就把俺的配置过程简单写一下
首先

sudo apt-get install mpd mpc
Copy Code 

然后复制一份配置文件到自己的用户目录

cd ~
cp /etc/mpd.conf .mpdconf
#创建几个文件夹,后面用到
mkdir .mpd
mkdir .mpd/playlists
Copy Code 

之后编辑.mpdconf,修改如下

#mp3所在的文件夹
music_directory		"/media/data/music"
#下面几个的user要替换成自己的用户名
playlist_directory		"/home/user/.mpd/playlists"
db_file			"/home/user/.mpd/tag_cache"
log_file			"/home/hualu/.mpd/mpd.log"
pid_file			"/home/hualu/.mpd/pid"
state_file			"/home/hualu/.mpd/state"
#替换成自己的用户名
user				"user"
Copy Code 

除了上面几项,我还修改了下面几个配置,如果改完已上配置就可以运行就没有必要修改下面的了
我注释了下面这行,为了解决mpc报”unable to bind port 6600″错误的问题

#bind_to_address		"localhost"
Copy Code 

声卡的配置我改成了下面,否则我用mpc调不了音量,而且有flash的时候会报”Failed to open ALSA device “plug:dmix”: Device or resource busy”

audio_output {
	type		"alsa"
	name		"My ALSA Device"
        options "dev=dmixer"
	mixer_control	"Master"		# optional
	mixer_index	"0"		# optional
}
Copy Code 

配置完毕,可以使用了

#首次运行需要初始化一下
mpd --create-db
#把所有曲目添加到播放列表
mpc listall | mpc add
#播放
mpc play
Copy Code 

准备做一个wordpress的离线编辑器

一月 24th, 2010

linux平台上一直没有这样一个所见即所得的blog离线编辑器,昨天试着用pyqt4写了一个小脚本,发现原来python做客户端软件是如此容易.然后下定决心要利用n个周末的时间自己写一个.

开始打算用纯qt的ui控件实现,但是感觉没有wordpress的编辑器这么亲切,于是想到一个界面亲切,实现也方便的方案: ui部分直接用web,框在一个pyqt的webkit组件里,逻辑部分用python的cgihttpserver在本地开一个cgi.

这个东西搞到今天雏形已经有了,可以实现跟wordress完全相同的书写体验.

顺带发那个pyqt的练手之作 : emlreader.py 一个可以查看eml附件的脚本