Skip to content

Commit 0443c23

Browse files
committed
fix: Add support multibyte to excerpt() helper
1 parent 1f2d8bc commit 0443c23

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
@@ -712,34 +712,34 @@ function alternator(...$args): string
712712
function excerpt(string $text, ?string $phrase = null, int $radius = 100, string $ellipsis = '...'): string
713713
{
714714
if (isset($phrase)) {
715-
$phrasePos = stripos($text, $phrase);
716-
$phraseLen = strlen($phrase);
715+
$phrasePos = mb_stripos($text, $phrase);
716+
$phraseLen = mb_strlen($phrase);
717717
} else {
718718
$phrasePos = $radius / 2;
719719
$phraseLen = 1;
720720
}
721721

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

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

729729
foreach (array_reverse($pre) as $e) {
730-
if ((strlen($e) + $count + 1) < $radius) {
730+
if ((mb_strlen($e) + $count + 1) < $radius) {
731731
$prev = ' ' . $e . $prev;
732732
}
733-
$count = ++$count + strlen($e);
733+
$count = ++$count + mb_strlen($e);
734734
}
735735

736736
$count = 0;
737737

738738
foreach ($pos as $s) {
739-
if ((strlen($s) + $count + 1) < $radius) {
739+
if ((mb_strlen($s) + $count + 1) < $radius) {
740740
$post .= $s . ' ';
741741
}
742-
$count = ++$count + strlen($s);
742+
$count = ++$count + mb_strlen($s);
743743
}
744744

745745
$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)