diff --git a/src/Parser.php b/src/Parser.php index 5cd8c34..c21e2b6 100644 --- a/src/Parser.php +++ b/src/Parser.php @@ -160,10 +160,11 @@ private function parseInput(string $name): Name if (count($segments) > 1) { // Reuse the split while preserving subclass parseSplitName() overrides. $tail = array_slice($segments, 1); - $this->preSplitTailStack[] = [implode(',', $tail), $tail]; + $given = implode(',', $tail); + $this->preSplitTailStack[] = [$given, $tail]; try { - return $this->parseSplitName($segments[0], implode(',', $tail)) + return $this->parseSplitName($segments[0], $given) ->setSource($name, $this->tokenizeSegments($segments)); } finally { array_pop($this->preSplitTailStack); diff --git a/tests/ParserTest.php b/tests/ParserTest.php index 7f5ca81..5da690c 100644 --- a/tests/ParserTest.php +++ b/tests/ParserTest.php @@ -815,6 +815,26 @@ protected function parseSplitName(string $surname, string $given): Name $this->assertSame('MD', $name->getSuffix()); } + public function testSplitHookCanRewriteSharedGivenString(): void + { + $parser = new class extends Parser { + #[\Override] + protected function parseSplitName(string $surname, string $given): Name + { + $given[1] = 'K'; + + return parent::parseSplitName($surname, $given); + } + }; + + $name = $parser->parse('Smith, Jane, MD'); + + $this->assertSame('Kane', $name->getFirstname()); + $this->assertSame('Smith', $name->getLastname()); + $this->assertSame('MD', $name->getSuffix()); + $this->assertSame('Smith, Jane, MD', $name->getSource()); + } + public function testSubclassMayOverrideSettersWithConcreteReturnType(): void { // The released 1.x API permits concrete Parser returns in subclass setters.