PHP में स्ट्रिंग को एक निश्चित संख्या में वर्णों के सबसे निकट कैसे लाएँ?


183

मेरे पास PHP में लिखा एक कोड स्निपेट है जो एक डेटाबेस से पाठ का एक खंड खींचता है और इसे एक वेबपेज पर एक विजेट को भेजता है। पाठ का मूल खंड एक लंबा लेख या एक छोटा वाक्य या दो हो सकता है; लेकिन इस विजेट के लिए, मैं 200 अक्षरों से अधिक नहीं कह सकता। मैं 200 वर्णों पर पाठ को काट देने के लिए सामग्री () का उपयोग कर सकता हूं, लेकिन परिणाम शब्दों के बीच में कट जाएगा - जो मैं वास्तव में चाहता हूं वह पाठ को 200 वर्णों से पहले अंतिम शब्द के अंत में काटना है ।


2
प्रश्न यह कहने का इरादा रखता है कि छंटा हुआ पाठ वेब पेज पर कुछ निश्चित संख्या में पिक्सेल में फिट होगा। इस मामले में, चुने हुए फ़ॉन्ट के आधार पर, प्रति चार्ट आवश्यक स्थान स्थिर नहीं है। और इसलिए हम यह नहीं मान सकते हैं कि उपलब्ध पिक्सल में 200 चार्ट सबसे उपयुक्त होंगे। अब तक (02-Mar-2011 तक), सभी नीचे दिए गए उत्तर इस बिंदु को याद कर रहे हैं और इसलिए उनमें से कोई भी एक विश्वसनीय समाधान प्रदान नहीं करता है। - :(
लायनहार्ट

1
नहीं, वास्तव में नहीं। आप एक विश्वसनीय तरीके से फ़ॉन्ट सेट कर सकते हैं, और फिर सबसे खराब स्थिति परिदृश्य उर्फ ​​को माप सकते हैं कि कितने व्यापक पात्र इसमें फिट होंगे। और यदि आपको 100% सुनिश्चित करने की आवश्यकता है कि ब्राउज़र ने इसे कैसे प्रस्तुत किया है, तो यह किसी भी तरह से PHP समस्या नहीं है।
मोलॉट

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

आपको s($str)->truncateSafely(200)मदद मिल सकती है , जैसा कि इस स्टैंडअलोन लाइब्रेरी में पाया गया है ।
caw

जवाबों:


221

Wordwrap फ़ंक्शन का उपयोग करके । यह कई लाइनों में ग्रंथों को विभाजित करता है जैसे कि अधिकतम चौड़ाई जिसे आपने निर्दिष्ट किया है, शब्द सीमाओं पर टूट रहा है। बंटवारे के बाद, आप बस पहली पंक्ति लेते हैं:

substr($string, 0, strpos(wordwrap($string, $your_desired_width), "\n"));

एक बात यह है कि इस oneliner संभाल नहीं है मामला है जब पाठ ही वांछित चौड़ाई से कम है। इस किनारे वाले मामले को संभालने के लिए, किसी को कुछ करना चाहिए:

if (strlen($string) > $your_desired_width) 
{
    $string = wordwrap($string, $your_desired_width);
    $string = substr($string, 0, strpos($string, "\n"));
}

उपरोक्त समाधान में समय से पहले पाठ को काटने की समस्या है यदि इसमें वास्तविक कटपॉइंट से पहले एक नई पंक्ति है। यहाँ एक संस्करण है जो इस समस्या को हल करता है:

function tokenTruncate($string, $your_desired_width) {
  $parts = preg_split('/([\s\n\r]+)/', $string, null, PREG_SPLIT_DELIM_CAPTURE);
  $parts_count = count($parts);

  $length = 0;
  $last_part = 0;
  for (; $last_part < $parts_count; ++$last_part) {
    $length += strlen($parts[$last_part]);
    if ($length > $your_desired_width) { break; }
  }

  return implode(array_slice($parts, 0, $last_part));
}

इसके अलावा, यहाँ PHPUnit testclass का उपयोग कार्यान्वयन का परीक्षण करने के लिए किया जाता है:

class TokenTruncateTest extends PHPUnit_Framework_TestCase {
  public function testBasic() {
    $this->assertEquals("1 3 5 7 9 ",
      tokenTruncate("1 3 5 7 9 11 14", 10));
  }

  public function testEmptyString() {
    $this->assertEquals("",
      tokenTruncate("", 10));
  }

  public function testShortString() {
    $this->assertEquals("1 3",
      tokenTruncate("1 3", 10));
  }

  public function testStringTooLong() {
    $this->assertEquals("",
      tokenTruncate("toooooooooooolooooong", 10));
  }

  public function testContainingNewline() {
    $this->assertEquals("1 3\n5 7 9 ",
      tokenTruncate("1 3\n5 7 9 11 14", 10));
  }
}

संपादित करें:

विशेष UTF8 वर्ण जैसे 'आ' को संभाला नहीं जाता है। इसे संभालने के लिए REGEX के अंत में 'u' जोड़ें:

$parts = preg_split('/([\s\n\r]+)/u', $string, null, PREG_SPLIT_DELIM_CAPTURE);


1
ऐसा लगता है कि यदि \nवांछित चौड़ाई से पहले है तो यह समय से पहले पाठ को काट देगा ।
केंडल हॉपकिंस

@ केंडलहोपकिंस: सच है, वास्तव में एक मुद्दा है। मैंने एक वैकल्पिक कार्यान्वयन के साथ उत्तर को अद्यतन किया जो दिए गए मुद्दे को हल करता है।
ग्रे पैंथर

क्या यह उदाहरण एक स्ट्रिंग के लिए काम करेगा जिसमें html टैग एक पैरा टैग की तरह हैं?
लिमिटलेसलूप

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

1
क्यों नहीं जोड़ा जा रहा है: यदि (strlen ($ string) <= $ your_desired_width) $ स्ट्रिंग लौटाते हैं; पहले बयान के रूप में?
डार्को रोमानोव

139

यह शब्दों के पहले 200 अक्षरों को लौटाएगा:

preg_replace('/\s+?(\S+)?$/', '', substr($string, 0, 201));

7
लगभग। ऐसा लगता है जैसे यह मेरे लिए वाक्य के अंतिम शब्द को हटा देता है चाहे कोई भी हो।
ReX357

महान काम करता है, लेकिन मुझे ReX357 जैसी त्रुटि मिली। जब 1 से अधिक शब्द होता है, तो यह पिछले एक को हटा देता है।
एंड्रेस एसके

25
यह सुनिश्चित करने के लिए कि आप जो परीक्षण कर रहे हैं, उससे अधिक लंबा है (इसे स्वीकार किए गए उत्तर के अनुसार)if (strlen($string) > $your_desired_width) { preg_replace(...); }
ब्लेयर मैकमिलन

मैंने @BlairMcMillan सलाह
Kim Stacks

2
रेगेक्स में छोटे सुधार: कोष्ठक मैच के लिए अंतिम \ S + वैकल्पिक बनाते हैं, लेकिन वे उन पात्रों को भी कैप्चर करते हैं। चूंकि हमें उन पात्रों को पकड़ने की आवश्यकता नहीं है, इसलिए कोष्ठकों को गैर-कैप्चरिंग की तरह /\s+?(?:\S+)?$/
बनाएं

45
$WidgetText = substr($string, 0, strrpos(substr($string, 0, 200), ' '));

और वहां आपके पास है - अधिकतम स्ट्रिंग लंबाई के नीचे रहते हुए, किसी भी स्ट्रिंग को निकटतम पूरे शब्द में ट्रंक करने की एक विश्वसनीय विधि।

मैंने ऊपर अन्य उदाहरणों की कोशिश की है और वे वांछित परिणाम नहीं देते हैं।


11
यदि दी गई स्ट्रिंग की लंबाई अधिकतम लंबाई से कम है, तो यह अंतिम स्थान तक सब कुछ काट देगा। इससे बचने के लिए, इसे एक ifबयान के अंदर लपेटें :if (strlen($str) > 200) { ... }
अमल मुरली

अन्य समाधानों की तुलना में सरल और शायद बहुत तेज है।
व्लादन

1
इसके साथ एक समस्या यह है कि यदि स्ट्रिंग में स्थान नहीं है तो यह एक खाली स्ट्रिंग लौटाता है।
21

सरल किया जा सकता है:$WidgetText = substr($string, 0, strpos($string, ' ', 200));
wranvaud

36

निम्नलिखित समाधान तब पैदा हुआ था जब मैंने wordwrap फ़ंक्शन का $ ब्रेक पैरामीटर देखा है :

स्ट्रिंग वर्डवैप (स्ट्रिंग $ str [, इंट $ चौड़ाई = 75 [, स्ट्रिंग $ ब्रेक = "\ n" [, बूल $ कट = गलत]]])

यहाँ समाधान है :

/**
 * Truncates the given string at the specified length.
 *
 * @param string $str The input string.
 * @param int $width The number of chars at which the string will be truncated.
 * @return string
 */
function truncate($str, $width) {
    return strtok(wordwrap($str, $width, "...\n"), "\n");
}

उदाहरण 1।

print truncate("This is very long string with many chars.", 25);

उपरोक्त उदाहरण आउटपुट होगा:

This is very long string...

उदाहरण # 2।

print truncate("This is short string.", 25);

उपरोक्त उदाहरण आउटपुट होगा:

This is short string.

2
यह काम नहीं करता है यदि स्ट्रिंग में पहले से ही एक नई लाइन चरित्र है (जैसे कि यदि आप descriptionब्लॉग पोस्ट को निकालने की कोशिश कर रहे हैं )
सुपरसन

1
@ सपरसन हमेशा सभी व्हाट्सएप preg_replace('/\s+/', ' ', $description)पात्रों को एक ही स्थान से बदलने के लिए पूर्व-प्रक्रिया कर सकता है;)
मावलो

9

ध्यान रखें कि जब भी आप कहीं भी "शब्द" से बंट रहे हों तो कुछ भाषाएं जैसे कि चीनी और जापानी शब्दों को विभाजित करने के लिए अंतरिक्ष वर्ण का उपयोग नहीं करते हैं। इसके अलावा, एक दुर्भावनापूर्ण उपयोगकर्ता बस बिना किसी रिक्त स्थान के पाठ दर्ज कर सकता है, या कुछ यूनिकोड लुक-अलाइक का उपयोग मानक स्थान वर्ण के लिए कर सकता है, जिस स्थिति में आप जिस भी समाधान का उपयोग करते हैं, वह पूरे पाठ को वैसे भी प्रदर्शित कर सकता है। इसके आस-पास का रास्ता स्ट्रिंग की लंबाई को सामान्य स्थानों पर विभाजित करने के बाद जाँच करने के लिए हो सकता है, फिर, यदि स्ट्रिंग अभी भी एक असामान्य सीमा से ऊपर है - शायद इस मामले में 225 वर्ण - आगे जा रहे हैं और इसे उस सीमा पर विनम्रतापूर्वक विभाजित कर रहे हैं।

इस तरह की चीजों के साथ एक और चेतावनी जब गैर-एएससीआईआई पात्रों की बात आती है; उनमें से स्ट्रिंग्स की व्याख्या PHP के मानक स्ट्रलेन () द्वारा की जा सकती है क्योंकि वे वास्तव में हैं, क्योंकि एक एकल वर्ण केवल एक के बजाय दो या अधिक बाइट्स ले सकता है। यदि आप स्ट्रिंग्स को विभाजित करने के लिए स्ट्रैलेन () / रूट () फ़ंक्शंस का उपयोग करते हैं, तो आप एक स्ट्रिंग को एक चरित्र के बीच में विभाजित कर सकते हैं! जब संदेह होता है, mb_strlen () / mb_substr () थोड़ा अधिक मूर्ख होता है।


8

स्ट्रैप और रूट का उपयोग करें:

<?php

$longString = "I have a code snippet written in PHP that pulls a block of text.";
$truncated = substr($longString,0,strpos($longString,' ',30));

echo $truncated;

यह आपको 30 वर्णों के बाद पहले स्थान पर एक स्ट्रिंग काट देगा।


1
नमस्ते, अगर अंतरिक्ष के बिना स्ट्रिंग की लंबाई कम होगी तो 30 तो यह वापसी त्रुटि होगी। और यहाँ परिणाम सबसे पहले 31 अक्षर नहीं 30 .. के लिए किया जाएगा
एर। अनुराग जैन

5

हेयर यू गो:

function neat_trim($str, $n, $delim='…') {
   $len = strlen($str);
   if ($len > $n) {
       preg_match('/(.{' . $n . '}.*?)\b/', $str, $matches);
       return rtrim($matches[1]) . $delim;
   }
   else {
       return $str;
   }
}

धन्यवाद, मैंने अपनी आवश्यकताओं के लिए इन सभी उत्तरों का सबसे उपयोगी और भरोसेमंद कार्य पाया। हालाँकि, मैं इसे मल्टी-बाइट स्ट्रिंग्स का समर्थन कैसे कर सकता हूं?
ctrlbrk

5

यहाँ मेरा फ़ंक्शन @ Cd-MaN के दृष्टिकोण पर आधारित है।

function shorten($string, $width) {
  if(strlen($string) > $width) {
    $string = wordwrap($string, $width);
    $string = substr($string, 0, strpos($string, "\n"));
  }

  return $string;
}

4
$shorttext = preg_replace('/^([\s\S]{1,200})[\s]+?[\s\S]+/', '$1', $fulltext);

विवरण:

  • ^ - स्ट्रिंग की शुरुआत से शुरू करें
  • ([\s\S]{1,200}) - किसी भी चरित्र के 1 से 200 तक प्राप्त करें
  • [\s]+?- लघु पाठ के अंत में रिक्त स्थान शामिल न करें ताकि हम word ...इसके बजाय से बच सकेंword...
  • [\s\S]+ - अन्य सभी सामग्री का मिलान करें

टेस्ट:

  1. regex101.comचलो orकुछ अन्य में जोड़ेंr
  2. regex101.com orrrr ठीक 200 अक्षर।
  3. regex101.comपांचवें के बाद r orrrrrबाहर रखा गया।

का आनंद लें।


मैं PHP प्रलेखन समझ में नहीं आता। मुझे पता है कि $1यह एक "प्रतिस्थापन" है, लेकिन इस विशिष्ट संदर्भ में यह क्या है ?? एक खाली चर?
ओल्डबॉय

1
@ एंथनी $1कोष्ठक के अंदर मिलान करने के लिए संदर्भित करता है ([\s\S]{1,200})$2पैटर्न में किसी भी तरह की दो दूसरी जोड़ी कोष्ठक का संदर्भ दिया जाएगा।
hlcs

3

यह आश्चर्य की बात है कि इस समस्या का सही समाधान खोजना कितना मुश्किल है। मुझे अभी तक इस पृष्ठ पर एक उत्तर नहीं मिला है जो कम से कम कुछ स्थितियों में विफल नहीं होता है (विशेषकर यदि स्ट्रिंग में newlines या टैब हैं, या यदि शब्द विराम एक स्थान के अलावा कुछ भी है, या यदि स्ट्रिंग में UTF है- 8 मल्टीबाइट अक्षर)।

यहां एक सरल समाधान है जो सभी मामलों में काम करता है। यहां समान उत्तर थे, लेकिन "s" संशोधक महत्वपूर्ण है यदि आप इसे बहु-पंक्ति इनपुट के साथ काम करना चाहते हैं, और "u" संशोधक इसे सही ढंग से UTF-8 मल्टीबाइट वर्ण का मूल्यांकन करता है।

function wholeWordTruncate($s, $characterCount) 
{
    if (preg_match("/^.{1,$characterCount}\b/su", $s, $match)) return $match[0];
    return $s;
}

इसके साथ एक संभावित किनारे का मामला ... यदि स्ट्रिंग में पहले $ वर्ण चरित्र में कोई व्हाट्सएप नहीं है, तो यह पूरे स्ट्रिंग को वापस कर देगा। यदि आप इसे पसंद करते हैं, तो यह $ वर्ण पर विराम लगाता है, भले ही यह शब्द सीमा न हो, आप इसका उपयोग कर सकते हैं:

function wholeWordTruncate($s, $characterCount) 
{
    if (preg_match("/^.{1,$characterCount}\b/su", $s, $match)) return $match[0];
    return mb_substr($return, 0, $characterCount);
}

एक अंतिम विकल्प, यदि आप इसे स्ट्रिंग जोड़ते हैं तो इसे दीर्घवृत्त जोड़ना चाहते हैं ...

function wholeWordTruncate($s, $characterCount, $addEllipsis = ' …') 
{
    $return = $s;
    if (preg_match("/^.{1,$characterCount}\b/su", $s, $match)) 
        $return = $match[0];
    else
        $return = mb_substr($return, 0, $characterCount);
    if (strlen($s) > strlen($return)) $return .= $addEllipsis;
    return $return;
}

2

मैं ऐसा करने के लिए preg_match फ़ंक्शन का उपयोग करता हूं, जैसा कि आप चाहते हैं कि एक बहुत ही सरल अभिव्यक्ति है।

$matches = array();
$result = preg_match("/^(.{1,199})[\s]/i", $text, $matches);

अभिव्यक्ति का अर्थ है "किसी स्थान से शुरू होने वाली लंबाई 1-200 से शुरू होने वाले किसी भी विकल्प से मेल खाना।" परिणाम $ परिणाम में है, और मैच $ मैचों में है। यह आपके मूल प्रश्न का ध्यान रखता है, जो विशेष रूप से किसी भी स्थान पर समाप्त होता है। यदि आप इसे नई सीमाओं पर समाप्त करना चाहते हैं, तो नियमित अभिव्यक्ति बदलें:

$result = preg_match("/^(.{1,199})[\n]/i", $text, $matches);

2

ठीक है, इसलिए मुझे उपरोक्त उत्तरों के आधार पर इसका एक और संस्करण मिला लेकिन खाते में अधिक चीजें लेना (utf-8, \ n और & nbsp;), यह भी एक लाइन है जो वर्डप्रेस शॉर्टकोड को अलग करती है अगर wp के साथ प्रयोग किया जाता है।

function neatest_trim($content, $chars) 
  if (strlen($content) > $chars) 
  {
    $content = str_replace('&nbsp;', ' ', $content);
    $content = str_replace("\n", '', $content);
    // use with wordpress    
    //$content = strip_tags(strip_shortcodes(trim($content)));
    $content = strip_tags(trim($content));
    $content = preg_replace('/\s+?(\S+)?$/', '', mb_substr($content, 0, $chars));

    $content = trim($content) . '...';
    return $content;
  }

2

यह मैटमैक के उत्तर के लिए एक छोटा सा फिक्स है:

preg_replace('/\s+?(\S+)?$/', '', substr($string . ' ', 0, 201));

केवल अंतर $ स्ट्रिंग के अंत में एक स्थान जोड़ने के लिए है। यह सुनिश्चित करता है कि अंतिम शब्द ReX357 की टिप्पणी के अनुसार कट नहीं गया है।

मेरे पास इसे टिप्पणी के रूप में जोड़ने के लिए पर्याप्त प्रतिनिधि नहीं हैं।


2
/*
Cut the string without breaking any words, UTF-8 aware 
* param string $str The text string to split
* param integer $start The start position, defaults to 0
* param integer $words The number of words to extract, defaults to 15
*/
function wordCutString($str, $start = 0, $words = 15 ) {
    $arr = preg_split("/[\s]+/",  $str, $words+1);
    $arr = array_slice($arr, $start, $words);
    return join(' ', $arr);
}

उपयोग:

$input = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna liqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.';
echo wordCutString($input, 0, 10); 

यह पहले 10 शब्दों का उत्पादन करेगा।

preg_splitसमारोह सबस्ट्रिंग में एक स्ट्रिंग को विभाजित करने के लिए किया जाता है। सीमाएं जिनके साथ स्ट्रिंग को विभाजित किया जाना है, एक नियमित अभिव्यक्ति पैटर्न का उपयोग करके निर्दिष्ट किया जाता है।

preg_split फ़ंक्शन 4 पैरामीटर लेता है, लेकिन अभी पहले 3 हमारे लिए प्रासंगिक हैं।

पहला पैरामीटर - पैटर्न पहला पैरामीटर नियमित अभिव्यक्ति पैटर्न है जिसके साथ स्ट्रिंग को विभाजित करना है। हमारे मामले में, हम स्ट्रिंग को शब्द सीमाओं में विभाजित करना चाहते हैं। इसलिए हम एक पूर्वनिर्धारित चरित्र वर्ग का उपयोग करते हैं \sजो अंतरिक्ष, टैब, कैरिज रिटर्न और लाइन फीड जैसे सफेद अंतरिक्ष वर्णों से मेल खाता है।

दूसरा पैरामीटर - इनपुट स्ट्रिंग दूसरा पैरामीटर लंबा टेक्स्ट स्ट्रिंग है जिसे हम विभाजित करना चाहते हैं।

तीसरा पैरामीटर - सीमा तीसरा पैरामीटर उन सबस्ट्रेट्स की संख्या को निर्दिष्ट करता है जिन्हें वापस किया जाना चाहिए। यदि आप सीमा निर्धारित करते हैं n, तो preg_split n तत्वों की एक सरणी लौटाएगा। पहले n-1तत्वों में पदार्थ शामिल होंगे। अंतिम (n th)तत्व में बाकी स्ट्रिंग शामिल होंगे।


1

@ जस्टिन पोली के रेगेक्स पर आधारित:

// Trim very long text to 120 characters. Add an ellipsis if the text is trimmed.
if(strlen($very_long_text) > 120) {
  $matches = array();
  preg_match("/^(.{1,120})[\s]/i", $very_long_text, $matches);
  $trimmed_text = $matches[0]. '...';
}

1

मेरे पास एक फ़ंक्शन है जो लगभग वही करता है जो आप चाहते हैं, यदि आप कुछ संपादन करेंगे, तो यह बिल्कुल फिट होगा:

<?php
function stripByWords($string,$length,$delimiter = '<br>') {
    $words_array = explode(" ",$string);
    $strlen = 0;
    $return = '';
    foreach($words_array as $word) {
        $strlen += mb_strlen($word,'utf8');
        $return .= $word." ";
        if($strlen >= $length) {
            $strlen = 0;
            $return .= $delimiter;
        }
    }
    return $return;
}
?>

1

मैंने इस तरह से इसे किया:

$string = "I appreciate your service & idea to provide the branded toys at a fair rent price. This is really a wonderful to watch the kid not just playing with variety of toys but learning faster compare to the other kids who are not using the BooksandBeyond service. We wish you all the best";

print_r(substr($string, 0, strpos(wordwrap($string, 250), "\n")));

0

मुझे पता है कि यह पुराना है, लेकिन ...

function _truncate($str, $limit) {
    if(strlen($str) < $limit)
        return $str;
    $uid = uniqid();
    return array_shift(explode($uid, wordwrap($str, $limit, $uid)));
}

0

मैं रूट के समान एक फ़ंक्शन बनाता हूं, और @ डीवे के विचार का उपयोग कर रहा हूं।

function substr_full_word($str, $start, $end){
    $pos_ini = ($start == 0) ? $start : stripos(substr($str, $start, $end), ' ') + $start;
    if(strlen($str) > $end){ $pos_end = strrpos(substr($str, 0, ($end + 1)), ' '); } // IF STRING SIZE IS LESSER THAN END
    if(empty($pos_end)){ $pos_end = $end; } // FALLBACK
    return substr($str, $pos_ini, $pos_end);
}

Ps .: पूरी लंबाई की कटाई कम से कम हो सकती है।


0

रिक्त स्थान के बिना तार से निपटने के लिए डेव और अमालुराली से कोड में IF / ELSEIF बयान जोड़े गए

if ((strpos($string, ' ') !== false) && (strlen($string) > 200)) { 
    $WidgetText = substr($string, 0, strrpos(substr($string, 0, 200), ' ')); 
} 
elseif (strlen($string) > 200) {
    $WidgetText = substr($string, 0, 200);
}

0

मुझे यह काम मिल रहा है:

फ़ंक्शन संक्षिप्त करें_string_to_whole_word ($ स्ट्रिंग, $ max_length, $ बफर) {

if (strlen($string)>$max_length) {
    $string_cropped=substr($string,0,$max_length-$buffer);
    $last_space=strrpos($string_cropped, " ");
    if ($last_space>0) {
        $string_cropped=substr($string_cropped,0,$last_space);
    }
    $abbreviated_string=$string_cropped."&nbsp;...";
}
else {
    $abbreviated_string=$string;
}

return $abbreviated_string;

}

बफर आपको लौटे स्ट्रिंग की लंबाई समायोजित करने की अनुमति देता है।


0

इसे इस्तेमाल करो:

निम्नलिखित कोड ',' को हटा देगा। यदि आपके पास कोई अभिभावक चरित्र या उप-स्ट्रिंग है, तो आप ',' के बजाय इसका उपयोग कर सकते हैं

substr($string, 0, strrpos(substr($string, 0, $comparingLength), ','))

// यदि आपके पास एक और स्ट्रिंग खाता है

substr($string, 0, strrpos(substr($string, 0, $comparingLength-strlen($currentString)), ','))

0

हालांकि यह एक पुराना सवाल है, मुझे लगा कि मैं एक विकल्प प्रदान करूंगा, क्योंकि यह PHP 4.3+ के लिए उल्लिखित और मान्य नहीं था।

आप सटीक संशोधक sprintfका उपयोग करके, पाठ को छोटा करने के लिए फ़ंक्शंस के परिवार का उपयोग कर सकते हैं %.ℕs

एक .पूर्णांक के बाद की अवधि जिसका अर्थ निर्दिष्टकर्ता पर निर्भर करता है:

  • ई, ई, एफ और एफ स्पेसर्स के लिए: यह दशमलव बिंदु के बाद मुद्रित होने वाले अंकों की संख्या है (डिफ़ॉल्ट रूप से, यह 6 है)।
  • जी और जी स्पेसिफ़र्स के लिए: यह मुद्रित किए जाने वाले महत्वपूर्ण अंकों की अधिकतम संख्या है।
  • S स्पेसियर के लिए: यह एक कटऑफ बिंदु के रूप में कार्य करता है, स्ट्रिंग के लिए अधिकतम वर्ण सीमा निर्धारित करता है

सरल ट्रंकेशन https://3v4l.org/QJDJU

$string = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
var_dump(sprintf('%.10s', $string));

परिणाम

string(10) "0123456789"

विस्तारित ट्रंकेशन https://3v4l.org/FCD21

चूंकि sprintfसमान substrरूप से कार्य करता है और आंशिक रूप से शब्दों को काट देगा। नीचे दिए गए दृष्टिकोण से यह सुनिश्चित होगा कि strpos(wordwrap(..., '[break]'), '[break]')एक विशेष सीमांकक के साथ शब्दों का उपयोग नहीं किया जाता है। यह हमें स्थिति को पुनः प्राप्त करने और यह सुनिश्चित करने की अनुमति देता है कि हम मानक वाक्य संरचनाओं पर मेल नहीं खाते।

आंशिक रूप से शब्दों को काटे बिना एक स्ट्रिंग लौटना और जो निर्दिष्ट चौड़ाई से अधिक नहीं है, जबकि वांछित होने पर लाइन-ब्रेक को संरक्षित करना।

function truncate($string, $width, $on = '[break]') {
    if (strlen($string) > $width && false !== ($p = strpos(wordwrap($string, $width, $on), $on))) {
        $string = sprintf('%.'. $p . 's', $string);
    }
    return $string;
}
var_dump(truncate('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ', 20));

var_dump(truncate("Lorem Ipsum is simply dummy text of the printing and typesetting industry.", 20));

var_dump(truncate("Lorem Ipsum\nis simply dummy text of the printing and typesetting industry.", 20));

परिणाम

/* 
string(36) "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"  
string(14) "Lorem Ipsum is" 
string(14) "Lorem Ipsum
is" 
*/

परिणाम का उपयोग कर wordwrap($string, $width)याstrtok(wordwrap($string, $width), "\n")

/*
string(14) "Lorem Ipsum is"
string(11) "Lorem Ipsum"
*/

-1

मैंने इससे पहले इसका इस्तेमाल किया था

<?php
    $your_desired_width = 200;
    $string = $var->content;
    if (strlen($string) > $your_desired_width) {
        $string = wordwrap($string, $your_desired_width);
        $string = substr($string, 0, strpos($string, "\n")) . " More...";
    }
    echo $string;
?>

-1

यहाँ आप यह कोशिश कर सकते हैं

substr( $str, 0, strpos($str, ' ', 200) ); 

उस समाधान का पहले ही अन्य उत्तरों में उल्लेख किया गया था। इसके साथ समस्या यह है कि यह विफल रहता है यदि स्ट्रिंग 200 वर्ण की लंबाई से कम है, या यदि इसमें कोई स्थान नहीं है। यह स्ट्रिंग को 200 वर्णों तक सीमित नहीं करता है, इसके बजाय यह 200 वर्णों के बाद अंतरिक्ष में स्ट्रिंग को तोड़ता है , जो कि आमतौर पर आप क्या चाहते हैं।
20

-1

मेरा मानना ​​है कि यह करने का सबसे आसान तरीका है:

$lines = explode('♦♣♠',wordwrap($string, $length, '♦♣♠'));
$newstring = $lines[0] . ' &bull; &bull; &bull;';

मैं पाठ को विभाजित करने और इसे काटने के लिए विशेष वर्णों का उपयोग कर रहा हूं।


-2

हो सकता है यह किसी की मदद करेगा:

<?php

    $string = "Your line of text";
    $spl = preg_match("/([, \.\d\-''\"\"_()]*\w+[, \.\d\-''\"\"_()]*){50}/", $string, $matches);
    if (isset($matches[0])) {
        $matches[0] .= "...";
        echo "<br />" . $matches[0];
    } else {
        echo "<br />" . $string;
    }

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