কীভাবে একটি নির্দিষ্ট সংখ্যক চরিত্রের নিকটতম শব্দটির পিএইচপিতে একটি স্ট্রিং ছাঁটাবেন?


183

আমার পিএইচপিতে লিখিত একটি কোড স্নিপেট রয়েছে যা একটি ডাটাবেস থেকে পাঠ্যের একটি ব্লক টানতে এবং এটি একটি ওয়েবপৃষ্ঠায় একটি উইজেটে প্রেরণ করে। পাঠ্যের মূল ব্লকটি একটি দীর্ঘ নিবন্ধ বা একটি ছোট বাক্য বা দুটি হতে পারে; তবে এই উইজেটের জন্য আমি 200 টির চেয়ে বেশি অক্ষর প্রদর্শন করতে পারি না। আমি 200 টি অক্ষরে টেক্সট কেটে ফেলতে সাবস্ট্রটার () ব্যবহার করতে পারি, তবে ফলাফলটি শব্দের মাঝখানে বিচ্ছিন্ন হয়ে যাবে - আমি যা চাই তা হল 200 অক্ষরের আগে শেষ শব্দের শেষে লেখাটি কাটা ।


2
প্রশ্নটি বলতে চাইছে যে কাটা টেক্সটটি কোনও ওয়েব পৃষ্ঠায় কিছু নির্দিষ্ট সংখ্যক পিক্সেলের সাথে খাপ খায়। এই ক্ষেত্রে, নির্বাচিত ফন্টের উপর নির্ভর করে, চর প্রতি প্রয়োজনীয় স্থান ধ্রুবক নয়। এবং তাই আমরা ধরে নিতে পারি না যে 200 অক্ষর উপলব্ধ পিক্সেলগুলির মধ্যে সবচেয়ে উপযুক্ত হবে। এখনও অবধি (০২-মার্চ-২০১১ অবধি), নীচের সমস্ত উত্তর এই পয়েন্টটি হারিয়েছে এবং সেগুলির কোনওই নির্ভরযোগ্য সমাধান সরবরাহ করে না। - :(
লায়নহার্ট

1
না, সত্যিই না। আপনি একটি নির্ভরযোগ্য উপায়ে ফন্ট সেট করতে পারেন, এবং তারপরে সবচেয়ে বিস্তৃত চরিত্রগুলির মধ্যে কতটা খাপ খায় তার সবচেয়ে খারাপ পরিস্থিতি পরিমাপ করুন And এবং যদি আপনার ব্রাউজারটি এটি কীভাবে রেন্ডার করে 100% নিশ্চিত হওয়া দরকার তবে এটি কোনও পিএইচপি সমস্যা নয়।
মোআট


এই স্ট্যান্ডলোন লাইব্রেরিতেs($str)->truncateSafely(200) যেমন পাওয়া যায় আপনি তেমন সহায়ক হতে পারেন ।
কাওয়

উত্তর:


221

ওয়ার্ড র‌্যাপ ফাংশন ব্যবহার করে । এটি পাঠ্যগুলিকে একাধিক লাইনে বিভক্ত করে দেয় যাতে সর্বাধিক প্রস্থটি আপনি নির্দিষ্ট করেছেন, শব্দের সীমা ভেঙে। বিভক্ত হওয়ার পরে, আপনি কেবল প্রথম লাইনটি নিন:

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

পাঠ্যটি যখন পছন্দসই প্রস্থের চেয়ে ছোট হয় তখন এই অনেলাইনার হ্যান্ডেল করে না the এই প্রান্ত-কেসটি পরিচালনা করতে, এমন কিছু করা উচিত:

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 টেস্টক্লাস রয়েছে:

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

সম্পাদনা:

'À' এর মতো বিশেষ ইউটিএফ 8 অক্ষর পরিচালনা করা হয় না। এটি হ্যান্ডেল করার জন্য আরইজিইএক্স শেষে 'ইউ' যুক্ত করুন:

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


1
এটি মনে \nহয় পছন্দসই প্রস্থের পূর্বে যদি এটি অকাল থেকেই পাঠ্য কেটে দেয় ।
কেন্ডাল হপকিনস

@ কেন্ডালহপকিন্স: সত্য, সত্যিই একটি সমস্যা আছে। আমি বিকল্পটি প্রয়োগের সাথে উত্তর আপডেট করেছি যা প্রদত্ত সমস্যা সমাধান করে।
ধূসর প্যান্থার

এই উদাহরণটি কোনও স্ট্রিংয়ের জন্য কাজ করবে যা অনুচ্ছেদে ট্যাগগুলির মতো এইচটিএমএল ট্যাগ রয়েছে?
সীমিতহীন

এটি আমার পক্ষে সত্যিই সহায়ক, আমার মাথাব্যথা দীর্ঘ Arabicঅক্ষর ছিল এবং এটি tokenTruncateফাংশনের সাহায্যে শব্দগুলি সংশোধন করতে এখন হ্রাস পেয়েছে .. মিলিয়ন মিলিয়ন :)
আদিত্য পি ভট্ট

1
কেন যুক্ত হচ্ছে না: যদি (স্ট্র্লেন ($ স্ট্রিং) <= $ আপনার_ ডিজায়ার_উইথথ) ফিরে আসে $ স্ট্রিং; প্রথম বিবৃতি হিসাবে?
ডার্কো রোমানভ

139

এটি শব্দের প্রথম 200 টি অক্ষর ফিরিয়ে দেবে:

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

7
প্রায়। দেখে মনে হচ্ছে এটি বাক্যটির সর্বশেষ শব্দটি মুছে ফেলেছে যাই হোক না কেন।
রেএক্স 357

দুর্দান্ত কাজ করে তবে আমি রেএক্স 357 এর মতো একই ত্রুটি পেয়েছি। যখন 1 টিরও বেশি শব্দ থাকে তখন এটি সর্বশেষটি মুছে দেয়।
আন্দ্রে এসকে

25
আপনি যা পরীক্ষা করছেন তার চেয়ে বেশি স্ট্রিং দীর্ঘ (তা গ্রহণযোগ্য উত্তর হিসাবে)if (strlen($string) > $your_desired_width) { preg_replace(...); }
ব্লেয়ার ম্যাকমিলান

@ ব্লেয়ারম্যাক মিলান পরামর্শ অন্তর্ভুক্ত করার জন্য আমি উত্তরটি সম্পাদনা করেছি
কিম স্ট্যাকস

2
রেজেক্সের ক্ষুদ্রতর উন্নতি: প্রথম বন্ধনী ম্যাচটির জন্য চূড়ান্ত \ এস + makeচ্ছিক করে তোলে তবে তারা সেই অক্ষরগুলিও ধারণ করে। যেহেতু আমাদের এই চরিত্রগুলি ক্যাপচার করার দরকার নেই, তাই প্রথম বন্ধনীগুলি নন-ক্যাপচারিংয়ের মতো করুন:/\s+?(?:\S+)?$/
প্যাক্রোনিন

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

এবং সেখানে আপনার এটি রয়েছে - সর্বাধিক স্ট্রিংয়ের দৈর্ঘ্যের নিচে থাকাকালীন কোনও স্ট্রিংটিকে নিকটতম পুরো শব্দটিতে ছাঁটাই করার একটি নির্ভরযোগ্য পদ্ধতি।

আমি উপরের অন্যান্য উদাহরণগুলি চেষ্টা করেছি এবং সেগুলি পছন্দসই ফলাফল দেয় নি।


11
যদি প্রদত্ত স্ট্রিংয়ের দৈর্ঘ্য সর্বাধিক দৈর্ঘ্যের চেয়ে কম হয় তবে এটি শেষ স্থান পর্যন্ত সমস্ত কিছু কেটে ফেলবে। এটি এড়াতে, এটিকে একটি ifবিবৃতিতে if (strlen($str) > 200) { ... }
অমল মুরালি

সহজ এবং সম্ভবত অন্যান্য সমাধানগুলির চেয়ে অনেক দ্রুত।
ভ্লাদান

1
এটির সাথে একটি সমস্যা হ'ল স্ট্রিংটিতে একটি স্থান না থাকলে এটি একটি খালি স্ট্রিং দেয়।
orrd

এটিকে সরলীকৃত করা যেতে পারে:$WidgetText = substr($string, 0, strpos($string, ' ', 200));
'15-এ ভ্রানভোড

36

নিম্নলিখিত সমাধানটির জন্ম হয়েছিল যখন আমি ওয়ার্ড র‌্যাপ ফাংশনের একটি of ব্রেক প্যারামিটারটি লক্ষ্য করেছি :

স্ট্রিং ওয়ার্ড র‌্যাপ (স্ট্রিং $ 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

আপনি যখনই কোথাও "শব্দ" দ্বারা বিভক্ত হয়ে গেছেন তা মনে রাখবেন যে কিছু ভাষা যেমন চীনা এবং জাপানি শব্দ বিভক্ত করতে কোনও স্থান অক্ষর ব্যবহার করে না। এছাড়াও, কোনও দূষিত ব্যবহারকারী কোনও স্পেস ছাড়াই টেক্সট প্রবেশ করতে পারে, বা কোনও ইউনিকোডকে স্ট্যান্ডার্ড স্পেস ক্যারেক্টারের মতো দেখতে ব্যবহার করতে পারে, সেক্ষেত্রে আপনি যে কোনও সমাধান ব্যবহার করেন না কেন পুরোপুরি প্রদর্শিত হতে পারে text এর চারপাশের উপায়টি স্ট্রিংয়ের দৈর্ঘ্যটি স্বাভাবিক হিসাবে স্পেসে বিভক্ত করার পরে পরীক্ষা করা উচিত, তারপরে, যদি স্ট্রিংটি এখনও অস্বাভাবিক সীমা থেকে isর্ধ্বে থাকে - সম্ভবত এই ক্ষেত্রে 225 টি অক্ষর রয়েছে - এবং এগিয়ে যেতে হবে এবং নির্ধারিতভাবে এই সীমাতে বিভক্ত করতে হবে।

এই -এসসিআইআই অক্ষরের ক্ষেত্রে এটির মতো জিনিসগুলির সাথে আরও একটি সতর্কতা; সেগুলিযুক্ত স্ট্রিংগুলি পিএইচপি-র স্ট্যান্ডার্ড স্ট্রেন () এর তুলনায় প্রকৃতপক্ষে লম্বা হওয়া হিসাবে ব্যাখ্যা করা যেতে পারে কারণ একটি একক অক্ষর কেবল একটির পরিবর্তে দুটি বা আরও বেশি বাইট নিতে পারে। আপনি যদি কেবল স্ট্রিংগুলিকে বিভক্ত করতে স্ট্র্লেন () / সাবস্ট্রাস্ট () ফাংশন ব্যবহার করেন তবে আপনি একটি অক্ষরের মাঝখানে একটি স্ট্রিং বিভক্ত করতে পারেন! সন্দেহ হলে, 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 এর কম হয় তবে তা ফিরে আসার ত্রুটি হবে। এবং এখানে ফলাফল 30 নয় প্রথম 31 টি অক্ষরের হতে পারে
এর। অনুরাগ জৈন

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

@ সিডি-এমএন এর পদ্ধতির উপর ভিত্তি করে এখানে আমার ফাংশন।

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বাদ পরে ।

উপভোগ করুন।


আমি পিএইচপি ডকুমেন্টেশন বুঝতে পারি না। আমি জানি যে এটি $1একটি "প্রতিস্থাপন", তবে এই নির্দিষ্ট প্রসঙ্গে এটি কী উল্লেখ করছে ?? একটি খালি ভেরিয়েবল?
ওল্ডবয়

1
$1ব্র্যাকেটের ভিতরে ম্যাচ করার জন্য অ্যান্টনি রেফারেন্সিং ([\s\S]{1,200})$2প্যাটার্নে যদি থাকে তবে দুটি দ্বিতীয় জোড়া বন্ধনী উল্লেখ করা হবে।
এইচএলসিএস

3

এই সমস্যাটির নিখুঁত সমাধান খুঁজে পাওয়া কতটা মুশকিল তা অবাক করে। আমি এই পৃষ্ঠায় এখনও একটি উত্তর পাইনি যা কমপক্ষে কিছু পরিস্থিতিতে ব্যর্থ হয় না (বিশেষত স্ট্রিংয়ে যদি নতুন লাইন বা ট্যাব থাকে, অথবা শব্দ বিরতি যদি কোনও স্থান ব্যতীত অন্য কিছু হয়, বা স্ট্রিংটিতে ইউটিএফ থাকে- 8 মাল্টিবাইট অক্ষর)।

এখানে একটি সহজ সমাধান যা সমস্ত ক্ষেত্রেই কাজ করে। এখানে একই রকম উত্তর ছিল, তবে আপনি যদি মাল্টি-লাইন ইনপুট নিয়ে কাজ করতে চান তবে "s" সংশোধকটি গুরুত্বপূর্ণ, এবং "ইউ" সংশোধক এটি ইউটিএফ -8 মাল্টিবাইট অক্ষরকে সঠিকভাবে মূল্যায়ন করতে সক্ষম করে।

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

এটির সাথে একটি সম্ভাব্য প্রান্তের কেস ... যদি স্ট্রিংটির প্রথম $ ক্যারেক্টারউন্টের অক্ষরগুলিতে কোনও শ্বেত স্পেস না থাকে তবে এটি পুরো স্ট্রিংটি ফিরিয়ে দেবে। আপনি যদি এটি পছন্দ করেন তবে এটি শব্দের সীমানা না হলেও এমনকি এটি $ ক্যারেক্টারউন্টে বিরতি জোর করে you

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

আমি এটি করতে প্রিগ_ম্যাচ ফাংশনটি ব্যবহার করব, আপনি যা চান তা খুব সহজ এক্সপ্রেশন।

$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;), ওয়ার্ডপ্রেস শর্টকোডগুলি সরিয়ে একটি লাইনও ডাব্লুপিপি ব্যবহার করা হলে মন্তব্য করেছে।

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

পার্থক্যটি হ'ল $ স্ট্রিংয়ের শেষে একটি স্থান যুক্ত করা। এটি নিশ্চিত করে রেেক্স 357 এর মন্তব্য অনুসারে শেষ শব্দটি কাটা হয়নি।

এটিকে মন্তব্য হিসাবে যুক্ত করার মতো পর্যাপ্ত রেপ পয়েন্ট আমার কাছে নেই।


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, প্রিগ_স্প্লিট 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 ((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

আমি এই কাজগুলি দেখতে পাচ্ছি:

ফাংশন সংক্ষিপ্ত_ স্ট্রিং_ থেকে_হোল_ওয়ার্ড ($ স্ট্রিং, $ সর্বোচ্চ_ দৈর্ঘ্য, $ বাফার) {

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

যদিও এটি একটি পুরানো প্রশ্ন, আমি ভেবেছিলাম যে আমি একটি বিকল্প সরবরাহ করব, কারণ এটি পিএইচপি ৪.৩++ এর জন্য উল্লেখ করা হয়নি এবং বৈধ ছিল না।

নির্ভুলতা সংশোধক sprintfব্যবহার করে আপনি পাঠ্যগুলি কাটাতে ফাংশনগুলির পরিবারকে ব্যবহার করতে পারেন %.ℕs

.পূর্ণসংখ্যা অনুসরণকারী একটি পিরিয়ড যার অর্থ অর্থ নির্দিষ্টকারীর উপর নির্ভর করে:

  • ই, ই, এফ এবং এফ স্পেসিফায়ারের জন্য: এটি দশমিক পয়েন্টের পরে মুদ্রণের জন্য অঙ্কগুলির সংখ্যা (ডিফল্টরূপে এটি 6)।
  • জি এবং জি স্পেসিফায়ারের জন্য: এটি মুদ্রণের জন্য উল্লেখযোগ্য অঙ্কের সর্বাধিক সংখ্যা।
  • এস স্পেসিফায়ারের জন্য: এটি স্ট্রিংয়ের সর্বাধিক অক্ষরের সীমা নির্ধারণ করে কাটফয়েন্ট পয়েন্ট হিসাবে কাজ করে

সরল ট্রানকেশন 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 টি অক্ষরের পরে স্পেসে স্ট্রিংটি ভেঙে দেয় , যা সাধারণত আপনি চান তা নয়।
অর্ডার

-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;
    }

?>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.