diff --git a/framework/yii/helpers/base/Inflector.php b/framework/yii/helpers/base/Inflector.php index cc5d33f..23fc032 100644 --- a/framework/yii/helpers/base/Inflector.php +++ b/framework/yii/helpers/base/Inflector.php @@ -475,4 +475,19 @@ class Inflector default: return $number . 'th'; } } + + /**+ + * Converts all special characters to the closest ascii character equivalent. + * @param string $string the string to be converted. + * @param array $replace the characters to be replaced by spaces. + * @return string the translated + */ + public static function ascii($string, $replace = array()) + { + if (!empty($replace)) { + $string = str_replace((array)$replace, ' ', $string); + } + $string = iconv('UTF-8', 'ASCII//TRANSLIT', $string); + return preg_replace("/[^a-zA-Z0-9\/_|+ -]/", '', $string); + } } diff --git a/tests/unit/framework/helpers/InflectorTest.php b/tests/unit/framework/helpers/InflectorTest.php index f1a98ba..5a99346 100644 --- a/tests/unit/framework/helpers/InflectorTest.php +++ b/tests/unit/framework/helpers/InflectorTest.php @@ -132,4 +132,20 @@ class InflectorTest extends TestCase { $this->assertEquals('21st', Inflector::ordinalize('21')); } + + public function testAscii() + { + $this->assertEquals("AAAAAAAECEEEEIIIIDNOOOOOUUUUYssaaaaaaaeceeeeiiiidnooooouuuuyy", + Inflector::ascii('ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöùúûüýÿ')); + $this->assertEquals("Messd up --text-- just to stress /test/ our little clean url function--", + Inflector::ascii("Mess'd up --text-- just (to) stress /test/ ?our! `little` \\clean\\ url fun.ction!?-->")); + $this->assertEquals("Perche l erba e verde", + Inflector::ascii("Perché l'erba è verde?", "'")); + $this->assertEquals("Peux-tu m aider s il te plait", + Inflector::ascii("Peux-tu m'aider s'il te plaît?", "'")); + $this->assertEquals("Tank-efter-nu-forrn-vi-foser-dig-bort", + Inflector::slug(Inflector::ascii("Tänk efter nu – förr'n vi föser dig bort"))); + $this->assertEquals("Custom delimiter example", + Inflector::ascii("Custom`delimiter*example", array('*', '`'))); + } }