Skip to content

Commit 6ee2083

Browse files
committed
fix: Add support multibyte to excerpt() helper
1 parent 84759c0 commit 6ee2083

File tree

2 files changed

+18
-8
lines changed

2 files changed

+18
-8
lines changed

system/Helpers/text_helper.php

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -711,34 +711,34 @@ function alternator(...$args): string
711711
function excerpt(string $text, ?string $phrase = null, int $radius = 100, string $ellipsis = '...'): string
712712
{
713713
if (isset($phrase)) {
714-
$phrasePos = stripos($text, $phrase);
715-
$phraseLen = strlen($phrase);
714+
$phrasePos = mb_stripos($text, $phrase);
715+
$phraseLen = mb_strlen($phrase);
716716
} else {
717717
$phrasePos = $radius / 2;
718718
$phraseLen = 1;
719719
}
720720

721-
$pre = explode(' ', substr($text, 0, $phrasePos));
722-
$pos = explode(' ', substr($text, $phrasePos + $phraseLen));
721+
$pre = explode(' ', mb_substr($text, 0, $phrasePos));
722+
$pos = explode(' ', mb_substr($text, $phrasePos + $phraseLen));
723723

724724
$prev = ' ';
725725
$post = ' ';
726726
$count = 0;
727727

728728
foreach (array_reverse($pre) as $e) {
729-
if ((strlen($e) + $count + 1) < $radius) {
729+
if ((mb_strlen($e) + $count + 1) < $radius) {
730730
$prev = ' ' . $e . $prev;
731731
}
732-
$count = ++$count + strlen($e);
732+
$count = ++$count + mb_strlen($e);
733733
}
734734

735735
$count = 0;
736736

737737
foreach ($pos as $s) {
738-
if ((strlen($s) + $count + 1) < $radius) {
738+
if ((mb_strlen($s) + $count + 1) < $radius) {
739739
$post .= $s . ' ';
740740
}
741-
$count = ++$count + strlen($s);
741+
$count = ++$count + mb_strlen($s);
742742
}
743743

744744
$ellPre = $phrase !== null ? $ellipsis : '';

tests/system/Helpers/TextHelperTest.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,11 @@ public function testExcerpt(): void
394394
$string = $this->_long_string;
395395
$result = ' Once upon a time, a framework had no tests. It sad So some nice people began to write tests. The more time that went on, the happier it became. ...';
396396
$this->assertSame(excerpt($string), $result);
397+
398+
$multibyteString = 'Давным-давно во фреймворке не было тестов. Это печально. И вот несколько хороших людей начали писать тесты. Чем больше времени проходило, тем счастливее становилось. Все были счастливы.';
399+
$multibyteResult = ' Давным-давно во фреймворке не было тестов. Это печ льно. И вот несколько хороших людей начали писать тесты. Чем больше времени проходило, тем ...';
400+
401+
$this->assertSame(excerpt($multibyteString), $multibyteResult);
397402
}
398403

399404
public function testExcerptRadius(): void
@@ -402,6 +407,11 @@ public function testExcerptRadius(): void
402407
$phrase = 'began';
403408
$result = '... people began to ...';
404409
$this->assertSame(excerpt($string, $phrase, 10), $result);
410+
411+
$multibyteString = 'Давным-давно во фреймворке не было тестов. Это печально. И вот несколько хороших людей начали писать тесты. Чем больше времени проходило, тем счастливее становилось. Все были счастливы.';
412+
$multibyteResult = '... Это печально . И вот ...';
413+
414+
$this->assertSame(excerpt($multibyteString, 'печально', 10), $multibyteResult);
405415
}
406416

407417
public function testAlternator(): void

0 commit comments

Comments
 (0)