PHPに関するインタビューの質問を見て、何か良い方法はないか試してみました。

WBOY
リリース: 2016-06-13 13:09:07
オリジナル
892 人が閲覧しました

看到PHP的一道面试题, 做了下, 不知道还有没好点方法
题目如下,
类似这样的aaasssddd字符串,写个函数CutStr($str,$max)实现截取:
1)如果$max大于$str的长度则返回$str
2)不包含在长度计算范围。
例:
如果CutStr("aaasssddd",6) 则返回aaasss.
如果CutStr("aaasssddd",4) 则返回aaas,不包含标签

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

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");

    // 如果不是数字或是负数, 或者大于字符长度, 直接返回原字符
    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));?
ログイン後にコピー


觉得这个方法好笨, 有什么别的好点的方法吗?

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

var str = "aaa<em>sss</em>ddd";  
  
function cutStr(str, max) {  
    var emSub = str.indexOf("<em>");  
    var em2Sub = str.indexOf("</em>");  
    // 如果不是数字或是负数, 或者大于字符长度, 直接返回原字符  
    if (!/^\d+$/.test(max) || max >= str.length - 9) return str; 
    else if(max > em2Sub-4) return str.substring(0, max + 9);
    else if(max > emSub) return str.substring(0, max + 4);
    else return str.substring(0, max);
}  
  
alert(cutStr(str, 7));  ?
ログイン後にコピー

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート