免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1922 | 回复: 1
打印 上一主题 下一主题

看到腾讯PHP的一道面试题, 做了下, 不知道还有没好点方法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-11 18:42 |只看该作者 |倒序浏览
看到腾讯PHP的一道面试题, 做了下, 不知道还有没好点方法









题目如下,
类似这样的aaa<em>sss</em>ddd字符串,写个函数CutStr($str,$max)实现截取:
1)如果$max大于$str的长度则返回$str
2)<em>和</em>不包含在长度计算范围。
例:
如果CutStr("aaa<em>sss</em>ddd",6) 则返回aaa<em>sss</em>.
如果CutStr("aaa<em>sss</em>ddd",4) 则返回aaas,不包含<em>标签

我的第一反应就是正则, 然后就...

Js代码
  1. 1.var str = "aaa<em>sss</em>ddd";   
  2. 2.  
  3. 3.function cutStr(str, max) {   
  4. 4.    // 首先把<em>和</em>先给剔除, 然后记录他们的位置   
  5. 5.    var reg = new RegExp("(.*?)<em>(.*?)</em>(.*?)");   
  6. 6.    var emSub = str.indexOf("<em>");   
  7. 7.    var em2Sub = str.indexOf("</em>");   
  8. 8.    var newstr = str.replace(reg, "$1$2$3");   
  9. 9.  
  10. 10.    // 如果不是数字或是负数, 或者大于字符长度, 直接返回原字符   
  11. 11.    if (!/^\d+$/.test(max) || max >= newstr.length) return str;   
  12. 12.  
  13. 13.    newstr = newstr.substring(0, max);   
  14. 14.    if (max <= emSub) { //小于三   
  15. 15.        return newstr;   
  16. 16.    } else if (max <= em2Sub - 4 && max > emSub) { // 大于三, 小于六时(注: -4 是为了减去第一个<em>占去的位置)   
  17. 17.        var tempReg = new RegExp("(\\w{" + emSub + "})(\\w*?)");   
  18. 18.        return newstr.replace(tempReg, "$1<em>$2");   
  19. 19.    } else { // 大于六   
  20. 20.        var tempReg = new RegExp("(\\w{" + emSub + "})(\\w{" + (em2Sub - emSub - 4) + "}?)(\\w*?)");   
  21. 21.        return newstr.replace(tempReg, "$1<em>$2</em>$3");   
  22. 22.    }   
  23. 23.}   
  24. 24.  
  25. 25.alert(cutStr(str, 7));​  
  26. var str = "aaa<em>sss</em>ddd";

  27. function cutStr(str, max) {
  28.     // 首先把<em>和</em>先给剔除, 然后记录他们的位置
  29.     var reg = new RegExp("(.*?)<em>(.*?)</em>(.*?)");
  30.     var emSub = str.indexOf("<em>");
  31.     var em2Sub = str.indexOf("</em>");
  32.     var newstr = str.replace(reg, "$1$2$3");

  33.     // 如果不是数字或是负数, 或者大于字符长度, 直接返回原字符
  34.     if (!/^\d+$/.test(max) || max >= newstr.length) return str;

  35.     newstr = newstr.substring(0, max);
  36.     if (max <= emSub) { //小于三
  37.         return newstr;
  38.     } else if (max <= em2Sub - 4 && max > emSub) { // 大于三, 小于六时(注: -4 是为了减去第一个<em>占去的位置)
  39.         var tempReg = new RegExp("(\\w{" + emSub + "})(\\w*?)");
  40.         return newstr.replace(tempReg, "$1<em>$2");
  41.     } else { // 大于六
  42.         var tempReg = new RegExp("(\\w{" + emSub + "})(\\w{" + (em2Sub - emSub - 4) + "}?)(\\w*?)");
  43.         return newstr.replace(tempReg, "$1<em>$2</em>$3");
  44.     }
  45. }

  46. alert(cutStr(str, 7));​
复制代码
觉得这个方法好笨, 有什么别的好点的方法吗?

想到了,, 原来这个这么简单,, 我把它想复杂了...


Js代码
  1. 1.var str = "aaa<em>sss</em>ddd";     
  2. 2.     
  3. 3.function cutStr(str, max) {     
  4. 4.    var emSub = str.indexOf("<em>");     
  5. 5.    var em2Sub = str.indexOf("</em>");     
  6. 6.    // 如果不是数字或是负数, 或者大于字符长度, 直接返回原字符     
  7. 7.    if (!/^\d+$/.test(max) || max >= str.length - 9) return str;   
  8. 8.    else if(max > em2Sub-4) return str.substring(0, max + 9);   
  9. 9.    else if(max > emSub) return str.substring(0, max + 4);   
  10. 10.    else return str.substring(0, max);   
  11. 11.}     
  12. 12.     
  13. 13.alert(cutStr(str, 7));  ​
复制代码

论坛徽章:
0
2 [报告]
发表于 2012-03-11 20:56 |只看该作者
谢谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP