看到騰訊PHP的一道面試題, 做了下, 不知道還有沒好點方法
題目如下,
類似這樣的aaa<em>sss</em>ddd字符串,寫個函數(shù)CutStr($str,$max)實現(xiàn)截。
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.var str = "aaa<em>sss</em>ddd";
- 2.
- 3.function cutStr(str, max) {
- 4. // 首先把<em>和</em>先給剔除, 然后記錄他們的位置
- 5. var reg = new RegExp("(.*?)<em>(.*?)</em>(.*?)");
- 6. var emSub = str.indexOf("<em>");
- 7. var em2Sub = str.indexOf("</em>");
- 8. var newstr = str.replace(reg, "$1$2$3");
- 9.
- 10. // 如果不是數(shù)字或是負數(shù), 或者大于字符長度, 直接返回原字符
- 11. if (!/^\d+$/.test(max) || max >= newstr.length) return str;
- 12.
- 13. newstr = newstr.substring(0, max);
- 14. if (max <= emSub) { //小于三
- 15. return newstr;
- 16. } else if (max <= em2Sub - 4 && max > emSub) { // 大于三, 小于六時(注: -4 是為了減去第一個<em>占去的位置)
- 17. var tempReg = new RegExp("(\\w{" + emSub + "})(\\w*?)");
- 18. return newstr.replace(tempReg, "$1<em>$2");
- 19. } else { // 大于六
- 20. var tempReg = new RegExp("(\\w{" + emSub + "})(\\w{" + (em2Sub - emSub - 4) + "}?)(\\w*?)");
- 21. return newstr.replace(tempReg, "$1<em>$2</em>$3");
- 22. }
- 23.}
- 24.
- 25.alert(cutStr(str, 7));
- var str = "aaa<em>sss</em>ddd";
- function cutStr(str, max) {
- // 首先把<em>和</em>先給剔除, 然后記錄他們的位置
- var reg = new RegExp("(.*?)<em>(.*?)</em>(.*?)");
- var emSub = str.indexOf("<em>");
- var em2Sub = str.indexOf("</em>");
- var newstr = str.replace(reg, "$1$2$3");
- // 如果不是數(shù)字或是負數(shù), 或者大于字符長度, 直接返回原字符
- if (!/^\d+$/.test(max) || max >= newstr.length) return str;
- newstr = newstr.substring(0, max);
- if (max <= emSub) { //小于三
- return newstr;
- } else if (max <= em2Sub - 4 && max > emSub) { // 大于三, 小于六時(注: -4 是為了減去第一個<em>占去的位置)
- var tempReg = new RegExp("(\\w{" + emSub + "})(\\w*?)");
- return newstr.replace(tempReg, "$1<em>$2");
- } else { // 大于六
- var tempReg = new RegExp("(\\w{" + emSub + "})(\\w{" + (em2Sub - emSub - 4) + "}?)(\\w*?)");
- return newstr.replace(tempReg, "$1<em>$2</em>$3");
- }
- }
- alert(cutStr(str, 7));
復制代碼 覺得這個方法好笨, 有什么別的好點的方法嗎?
想到了,, 原來這個這么簡單,, 我把它想復雜了...
Js代碼- 1.var str = "aaa<em>sss</em>ddd";
- 2.
- 3.function cutStr(str, max) {
- 4. var emSub = str.indexOf("<em>");
- 5. var em2Sub = str.indexOf("</em>");
- 6. // 如果不是數(shù)字或是負數(shù), 或者大于字符長度, 直接返回原字符
- 7. if (!/^\d+$/.test(max) || max >= str.length - 9) return str;
- 8. else if(max > em2Sub-4) return str.substring(0, max + 9);
- 9. else if(max > emSub) return str.substring(0, max + 4);
- 10. else return str.substring(0, max);
- 11.}
- 12.
- 13.alert(cutStr(str, 7));
復制代碼 |