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