diff --git a/src/Word/CamelCaseToSeparator.php b/src/Word/CamelCaseToSeparator.php index 0acee464..07111b11 100644 --- a/src/Word/CamelCaseToSeparator.php +++ b/src/Word/CamelCaseToSeparator.php @@ -26,10 +26,18 @@ public function filter($value) } if (StringUtils::hasPcreUnicodeSupport()) { - $pattern = ['#(?<=(?:\p{Lu}))(\p{Lu}\p{Ll})#', '#(?<=(?:\p{Ll}|\p{Nd}))(\p{Lu})#']; - $replacement = [$this->separator . '\1', $this->separator . '\1']; + /** + * First: Match right after a lowercase letter or digit following a capital letter or + * before a capital letter with a lowercese letter on it's right. + * + * Second: Match right after a lowercase letter following zero or more digits + * or a capital letter + */ + $pattern = ['#(?<=\p{Ll}|\p{Nd})(?=\p{Lu})|(?<=\p{Lu})(?=\p{Lu}\p{Ll})#', '#(?<=(?:\p{Ll}))(\p{Lu}|(\p{Nd}+))#']; + $replacement = [ $this->separator . '\1', $this->separator . '\1', + ]; } else { - $pattern = ['#(?<=(?:[A-Z]))([A-Z]+)([A-Z][a-z])#', '#(?<=(?:[a-z0-9]))([A-Z])#']; + $pattern = [ '#(?<=[a-z0-9])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])#', '#(?<=(?:[a-z]))([A-Z]|([0-9]+))#' ]; $replacement = ['\1' . $this->separator . '\2', $this->separator . '\1']; } diff --git a/test/Word/CamelCaseToDashTest.php b/test/Word/CamelCaseToDashTest.php index 82f3e1ff..30fdbd89 100644 --- a/test/Word/CamelCaseToDashTest.php +++ b/test/Word/CamelCaseToDashTest.php @@ -23,4 +23,31 @@ public function testFilterSeparatesCamelCasedWordsWithDashes() $this->assertNotEquals($string, $filtered); $this->assertEquals('Camel-Cased-Words', $filtered); } + + /** + * @dataProvider camelizedStrings + */ + public function testFilterSeparatesCamelCasedWordsContainingNumbersWithDashes($camel, $dashed) + { + $filter = new CamelCaseToDashFilter(); + $filtered = $filter($camel); + $this->assertNotEquals($camel, $filtered); + $this->assertEquals($dashed, $filtered); + } + + /** + * Provides CamelizedStrings to test + * + * @return array + */ + public function camelizedStrings() + { + return [ + [ 'CamelCasedWith2016Numbers', 'Camel-Cased-With-2016-Numbers' ], + [ '10NumbersAsPrefix', '10-Numbers-As-Prefix' ], + [ 'NumberSuffix42', 'Number-Suffix-42' ], + [ 'lower50Upper', 'lower-50-Upper' ], + [ 'dashed-2016Bar', 'dashed-2016-Bar'], + ]; + } } diff --git a/test/Word/CamelCaseToUnderscoreTest.php b/test/Word/CamelCaseToUnderscoreTest.php index 5a01ec5e..0779bd93 100644 --- a/test/Word/CamelCaseToUnderscoreTest.php +++ b/test/Word/CamelCaseToUnderscoreTest.php @@ -38,13 +38,13 @@ public function testFilterSeperatingNumbersToUnterscore() $filtered = $filter($string); $this->assertNotEquals($string, $filtered); - $this->assertEquals('Pa2_Title', $filtered); + $this->assertEquals('Pa_2_Title', $filtered); $string = 'Pa2aTitle'; $filter = new CamelCaseToUnderscoreFilter(); $filtered = $filter($string); $this->assertNotEquals($string, $filtered); - $this->assertEquals('Pa2a_Title', $filtered); + $this->assertEquals('Pa_2a_Title', $filtered); } }