एक स्ट्रिंग के पहले n अक्षर प्राप्त करें


320

मैं PHP में एक स्ट्रिंग के पहले n अक्षर कैसे प्राप्त कर सकता हूं? किसी विशिष्ट संख्या के लिए स्ट्रिंग को ट्रिम करने का सबसे तेज़ तरीका क्या है, और यदि आवश्यक हो तो '...' को जोड़ना चाहिए?


5
एलिप्सिस पात्र का उपयोग करना बेहतर हो सकता है ...
कीट

1
यदि आपको शब्दों को काटने से बचने की आवश्यकता है, तो मेरे उत्तर को देखें।
TechNyquist


इस लिंक को आज़माएं, आपकी मदद कर सकते हैं ... stackoverflow.com/a/26098951/3944217
edCoder 29'14

जवाबों:


577
//The simple version for 10 Characters from the beginning of the string
$string = substr($string,0,10).'...';

अपडेट करें:

लंबाई की जाँच करने के सुझाव के आधार पर (और छंटनी और अनट्रेंड स्ट्रिंग्स पर समान लंबाई सुनिश्चित करना):

$string = (strlen($string) > 13) ? substr($string,0,10).'...' : $string;

तो आपको अधिकतम 13 वर्णों की एक स्ट्रिंग मिलेगी; या तो 13 (या उससे कम) सामान्य वर्ण या 10 वर्ण उसके बाद '...'

अपडेट 2:

या समारोह के रूप में:

function truncate($string, $length, $dots = "...") {
    return (strlen($string) > $length) ? substr($string, 0, $length - strlen($dots)) . $dots : $string;
}

अपडेट 3:

जब से मैंने यह उत्तर लिखा है तब से कुछ समय हो गया है और मैं वास्तव में इस कोड का उपयोग नहीं करता हूं। मैं इस फ़ंक्शन को पसंद करता हूं जो फ़ंक्शन का उपयोग करके किसी शब्द के बीच में स्ट्रिंग को तोड़ने से रोकता है wordwrap:

function truncate($string,$length=100,$append="…") {
  $string = trim($string);

  if(strlen($string) > $length) {
    $string = wordwrap($string, $length);
    $string = explode("\n", $string, 2);
    $string = $string[0] . $append;
  }

  return $string;
}

11
3 डॉट्स (...) के बजाय एलिप्सिस (...) से बदलना सर्वोत्तम हो सकता है
केट

3
मुझे यह पसंद है, लेकिन मैंने इसे बदल दिया और अंत में व्हॉट्सएप को हटाने के लिए निम्नलिखित का उपयोग करें: $ string = root (ट्रिम ($ string), 0,10)।'.. '); इस तरह आपको "आई लाइक टू ..." के बजाय "आई लाइक ... ..." जैसा कुछ मिलता है।
केंटन डे जोंग

28
"हेलिप" - मुझे यह समझने में कुछ समय लगा कि हम शैतान के आईपी एड्रेस के बारे में बात नहीं कर रहे थे
लुकास बर्नार्डो डी सूसा

2
अपडेट 3 सबसे मददगार है।
दूधोवस्की

मामले में लौटी स्ट्रिंग की लंबाई पर एक सख्त टोपी है, क्या अद्यतन 3 की 5 पंक्ति नहीं होनी चाहिए $string = wordwrap($string, $length - sizeof($append)); ?
माइकल क्रेंशॉ

114

यह कार्यक्षमता संस्करण 4.0.6 के बाद से PHP में बनाई गई है। डॉक्स देखें

echo mb_strimwidth('Hello World', 0, 10, '...');

// outputs Hello W...

ध्यान दें कि trimmarker(ऊपर दी गई दीर्घवृत्त) छोटी लंबाई में शामिल है।


4
मेरे लिए पूरी तरह से काम किया। शीर्ष उत्तर से काम नहीं चला, और मुझे खुशी है कि ऐसा नहीं हुआ क्योंकि स्क्रॉल किया गया और यह मणि मिला।
एडुआर्डो

धन्यवाद, मैंने हमेशा इस लंबी और पुरानी पद्धति का उपयोग किया है!
gr3g

1
दान, आप थोड़ा और विशिष्ट होना चाहते हैं जिसके बारे में शीर्ष उत्तर का कौन सा हिस्सा आपके लिए काम नहीं करता। फ़ंक्शन ट्रंकट () ने मेरे लिए पूरी तरह से काम किया और ब्रूकोव्स्की के उत्तर पर उस उत्तर का लाभ यह है कि यह शब्द सीमाओं पर टूट जाता है; यह मानते हुए कि आप उस प्रकार की परवाह करते हैं।
pdwalker

2
अच्छी पकड़! कई अनुभवी PHP डेवलपर इस फ़ंक्शन के बारे में नहीं जानते हैं :)
jroi_web

1
शीर्ष (अभी) उत्तर ( stackoverflow.com/a/3161830/236306 ) ने कुछ भी नहीं किया (जैसे कि मैंने fn का उपयोग नहीं किया है)। पता नहीं क्यों। यह जवाब हालांकि सही लगता है और काम करने के अतिरिक्त लाभ के साथ आया है।
एलन

15

यदि आप स्ट्रिंग चार्ट पर नियंत्रण की आवश्यकता है, तो मल्टीबाइट एक्सटेंशन काम में आ सकता है।

$charset = 'UTF-8';
$length = 10;
$string = 'Hai to yoo! I like yoo soo!';
if(mb_strlen($string, $charset) > $length) {
  $string = mb_substr($string, 0, $length - 3, $charset) . '...';
}

यह कोड स्ट्रिंग में तीन डॉट्स जोड़ रहा है? मेरे कोड में इसका लिंक टैग <a> है और जब मैं इसे लिंक करता हूँ तो यह इसे एक साथ तीन बिंदुओं के साथ जोड़ देगा जो एक अलग मूल्य के रूप में आएगा।
फेलो

9

कभी-कभी, आपको स्ट्रिंग को अंतिम पूर्ण शब्द तक सीमित करने की आवश्यकता होती है: यानी आप नहीं चाहते कि अंतिम शब्द टूट जाए बजाय इसके कि आप दूसरे अंतिम शब्द के साथ रुकें।

उदाहरण: हमें "यह मेरा स्ट्रिंग है" को 6 वर्णों तक सीमित करने की आवश्यकता है, लेकिन 'यह i ... "के बजाय हम चाहते हैं कि यह' यह हो ..." अर्थात हम उस टूटे हुए अक्षरों को अंतिम शब्द में छोड़ देंगे।

पापा, समझाने में बुरा है, यहाँ कोड है।

class Fun {

    public function limit_text($text, $len) {
        if (strlen($text) < $len) {
            return $text;
        }
        $text_words = explode(' ', $text);
        $out = null;


        foreach ($text_words as $word) {
            if ((strlen($word) > $len) && $out == null) {

                return substr($word, 0, $len) . "...";
            }
            if ((strlen($out) + strlen($word)) > $len) {
                return $out . "...";
            }
            $out.=" " . $word;
        }
        return $out;
    }

}

9

यदि आप शब्दों को विभाजित न करने के लिए सावधान रहना चाहते हैं, तो आप निम्नलिखित कार्य कर सकते हैं

function ellipse($str,$n_chars,$crop_str=' [...]')
{
    $buff=strip_tags($str);
    if(strlen($buff) > $n_chars)
    {
        $cut_index=strpos($buff,' ',$n_chars);
        $buff=substr($buff,0,($cut_index===false? $n_chars: $cut_index+1)).$crop_str;
    }
    return $buff;
}

यदि $ str $ n_chars से कम है तो यह अछूता रहता है।

यदि $ str $ n_chars के बराबर है तो इसे वापस भी किया जाता है।

यदि $ str $ n_chars से अधिक लंबा है, तो यह कटौती करने के लिए अगले स्थान की तलाश करता है या (यदि अंत तक अधिक रिक्त स्थान नहीं है) $ str $ n_chars के बजाय अशिष्ट रूप से कट जाता है।

नोट: ध्यान रखें कि यह विधि HTML के मामले में सभी टैग को हटा देगी।


8

कोडाइन्गाइटर फ्रेमवर्क में इसके लिए एक सहायक होता है, जिसे "टेक्स्ट हेल्पर" कहा जाता है। यहां कोडाइनाइटर के उपयोगकर्ता गाइड से कुछ दस्तावेज हैं जो लागू होते हैं: http://codeigniter.com/user_guide/helpers/text_helper.html (बस वर्ड_limiter और character_limiter अनुभाग पढ़ें)। यहां आपके प्रश्न से संबंधित दो कार्य हैं:

if ( ! function_exists('word_limiter'))
{
    function word_limiter($str, $limit = 100, $end_char = '&#8230;')
    {
        if (trim($str) == '')
        {
            return $str;
        }

        preg_match('/^\s*+(?:\S++\s*+){1,'.(int) $limit.'}/', $str, $matches);

        if (strlen($str) == strlen($matches[0]))
        {
            $end_char = '';
        }

        return rtrim($matches[0]).$end_char;
    }
}

तथा

if ( ! function_exists('character_limiter'))
{
    function character_limiter($str, $n = 500, $end_char = '&#8230;')
    {
        if (strlen($str) < $n)
        {
            return $str;
        }

        $str = preg_replace("/\s+/", ' ', str_replace(array("\r\n", "\r", "\n"), ' ', $str));

        if (strlen($str) <= $n)
        {
            return $str;
        }

        $out = "";
        foreach (explode(' ', trim($str)) as $val)
        {
            $out .= $val.' ';

            if (strlen($out) >= $n)
            {
                $out = trim($out);
                return (strlen($out) == strlen($str)) ? $out : $out.$end_char;
            }       
        }
    }
}

4

सबस्ट्रिंग का उपयोग करें

http://php.net/manual/en/function.substr.php

$foo = substr("abcde",0, 3) . "...";

3
यह कोड हमेशा जोड़ देगा ... स्ट्रिंग के लिए, जो वह नहीं चाहता था।
ट्रैविसो

आप बिलकुल सही हैं, और मैंने उसी के अनुसार उत्तर संपादित किया। (संशोधित उत्तर वर्तमान में एसओ सहकर्मी समीक्षा की प्रतीक्षा कर रहा है)
चाया कूपर



1

मैं यह करता हूं

    function cutat($num, $tt){
        if (mb_strlen($tt)>$num){
            $tt=mb_substr($tt,0,$num-2).'...';
        }
        return $tt;
    }

जहाँ $ संख्या में चार संख्याओं के लिए खड़ा है, और $ tt हेरफेर के लिए स्ट्रिंग है।


1

मैंने इस उपयोग के लिए एक फ़ंक्शन विकसित किया

 function str_short($string,$limit)
        {
            $len=strlen($string);
            if($len>$limit)
            {
             $to_sub=$len-$limit;
             $crop_temp=substr($string,0,-$to_sub);
             return $crop_len=$crop_temp."...";
            }
            else
            {
                return $string;
            }
        }

आप स्ट्रिंग और लिमाइट
जैसे फ़ंक्शन को कहते हैं जैसे str_short("hahahahahah",5):;
यह आपके तार को काट देगा और अंत में "..." जोड़ देगा
:)


1

एक फ़ंक्शन (दोहराने के उपयोग के लिए) और डायनेमिक सीमित लंबाई के भीतर बनाने के लिए, उपयोग करें:

function string_length_cutoff($string, $limit, $subtext = '...')
{
    return (strlen($string) > $limit) ? substr($string, 0, ($limit-strlen(subtext))).$subtext : $string;
}

// example usage:
echo string_length_cutoff('Michelle Lee Hammontree-Garcia', 26);

// or (for custom substitution text
echo string_length_cutoff('Michelle Lee Hammontree-Garcia', 26, '..');

1

यह आप की तरह कोड करने के लिए सबसे अच्छा है (नोटिस सीमा वैकल्पिक है और 10 तक चूक है):

print limit($string);


function limit($var, $limit=10)
{
    if ( strlen($var) > $limit )
    {
        return substr($string, 0, $limit) . '...';
    }
    else
    {
        return $var;
    }
}

1
यह काम नहीं करेगा क्योंकि ट्रिम () पहले से मौजूद है।
गॉर्डन

समझा सकता है कि यह दृष्टिकोण केवल यह बताने के बजाय कि यह क्यों है?
रॉबर्ट

1
@ रॉबर्ट यह सरल है, और अमूर्त का मतलब है कि आपको बार-बार कोड को फिर से लिखना नहीं पड़ता है। और सबसे महत्वपूर्ण बात, यदि आप ऐसा करने के लिए एक बेहतर तरीका खोजते हैं, या कुछ अधिक जटिल चाहते हैं, तो आप केवल 50 टुकड़ों के कोड के बजाय इस 1 फ़ंक्शन को बदलते हैं।
ट्रैविसो

2
क्यों फ़ंक्शन अपरकेस है?
कार्लो

फिक्स: $ var का रूट, न कि $ स्ट्रिंग। टेस्ट करें $limit + 3ताकि आप एक स्ट्रिंग को केवल सीमा पर ट्रिम न करें । आपके आवेदन पर निर्भर करता है (जैसे, HTML आउटपुट), &hellip;इसके बजाय एक इकाई का उपयोग करने पर विचार करें (टाइपोग्राफिक रूप से अधिक सुखदायक)। जैसा कि पहले सुझाव दिया गया है, दीर्घवृत्त लागू करने से पहले (छोटा) स्ट्रिंग के अंत से किसी भी गैर-पत्र को ट्रिम करें। अंत में, देखें कि क्या आप मल्टीबाइट में हैं (जैसे, UTF-8) पर्यावरण - आप स्ट्रैलेन () और रूट () का उपयोग नहीं कर सकते हैं।
फिल पेरी


0

पदार्थ () सबसे अच्छा होगा, आप पहले स्ट्रिंग की लंबाई भी जांचना चाहेंगे

$str = 'someLongString';
$max = 7;

if(strlen($str) > $max) {
   $str = substr($str, 0, $max) . '...';
}

wordwrap स्ट्रिंग को नीचे ट्रिम नहीं करेगा, बस इसे विभाजित करें ...


0

$ चौड़ाई = 10;

$a = preg_replace ("~^(.{{$width}})(.+)~", '\\1…', $a);

या वर्डवैप के साथ

$a = preg_replace ("~^(.{1,${width}}\b)(.+)~", '\\1…', $a);

0

यह समाधान शब्दों में कटौती नहीं करेगा, यह पहले स्थान के बाद तीन डॉट्स जोड़ देगा। मैंने @ Raccoon29 समाधान का संपादन किया और मैंने सभी कार्यों को mb_ फ़ंक्शन से बदल दिया ताकि यह अरबी जैसी सभी भाषाओं के लिए काम करे

function cut_string($str, $n_chars, $crop_str = '...') {
    $buff = strip_tags($str);
    if (mb_strlen($buff) > $n_chars) {
        $cut_index = mb_strpos($buff, ' ', $n_chars);
        $buff = mb_substr($buff, 0, ($cut_index === false ? $n_chars : $cut_index + 1), "UTF-8") . $crop_str;
    }
    return $buff;
}

0
$yourString = "bla blaaa bla blllla bla bla";
$out = "";
if(strlen($yourString) > 22) {
    while(strlen($yourString) > 22) {
        $pos = strrpos($yourString, " ");
        if($pos !== false && $pos <= 22) {
            $out = substr($yourString,0,$pos);
            break;
        } else {
            $yourString = substr($yourString,0,$pos);
            continue;
        }
    }
} else {
    $out = $yourString;
}
echo "Output String: ".$out;

0

यदि काटे गए तार की लंबाई पर कोई सख्त आवश्यकता नहीं है, तो व्यक्ति अंतिम शब्द को काटने और रोकने के लिए इसका उपयोग कर सकता है:

$text = "Knowledge is a natural right of every human being of which no one
has the right to deprive him or her under any pretext, except in a case where a
person does something which deprives him or her of that right. It is mere
stupidity to leave its benefits to certain individuals and teams who monopolize
these while the masses provide the facilities and pay the expenses for the
establishment of public sports.";

// we don't want new lines in our preview
$text_only_spaces = preg_replace('/\s+/', ' ', $text);

// truncates the text
$text_truncated = mb_substr($text_only_spaces, 0, mb_strpos($text_only_spaces, " ", 50));

// prevents last word truncation
$preview = trim(mb_substr($text_truncated, 0, mb_strrpos($text_truncated, " ")));

इस मामले में, $previewहोगा "Knowledge is a natural right of every human being"

लाइव कोड उदाहरण: http://sandbox.onlinephpfunctions.com/code/25484a8b687d1f5ad93f62082b6379662a6b4713

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.