1
0
mirror of https://github.com/danielstjules/Stringy.git synced 2025-08-12 08:14:06 +02:00

Fix for collapseWhitespace() not being able to handle multibyte space characters

This commit is contained in:
Daniel St. Jules
2013-08-06 22:39:47 -04:00
parent 7a64dad935
commit f1abc38c17
6 changed files with 25 additions and 16 deletions

View File

@@ -97,7 +97,7 @@ of the former is the following:
```php
use Stringy\Stringy as S;
echo S::create("Fòô Bàř", 'UTF-8')->collapseWhitespace()->swapCase(); // 'fÒÔ bÀŘ'
echo S::create('Fòô Bàř', 'UTF-8')->collapseWhitespace()->swapCase(); // 'fÒÔ bÀŘ'
```
`Stringy\Stringy` contains a __toString() method, which returns the current
@@ -108,8 +108,8 @@ Using the static wrapper, an alternative is the following:
```php
use Stringy\StaticStringy as S;
$string = S::collapseWhitespace("Fòô Bàř", 'UTF-8');
echo S::swapCase($string, 'UTF-8'); // 'fÒÔ bÀŘ''
$string = S::collapseWhitespace('Fòô Bàř', 'UTF-8');
echo S::swapCase($string, 'UTF-8'); // 'fÒÔ bÀŘ'
```
## Methods
@@ -151,10 +151,11 @@ S::camelize('Camel-Case'); // 'camelCase'
$stringy->collapseWhitespace()
S::collapseWhitespace(string $str)
S::collapseWhitespace(string $str [, string $encoding ])
Trims the string and replaces consecutive whitespace characters with a
single space. This includes tabs and newline characters.
single space. This includes tabs and newline characters, as well as
multibyte whitespace such as the thin space and ideographic space.
```php
S::create(' Ο συγγραφέας ')->collapseWhitespace();

View File

@@ -142,14 +142,15 @@ class StaticStringy
/**
* Trims the string and replaces consecutive whitespace characters with a
* single space. This includes tabs and newline characters.
* single space. This includes tabs and newline characters, as well as
* multibyte whitespace such as the thin space and ideographic space.
*
* @param string $str The string to cleanup whitespace
* @return string The trimmed string with condensed whitespace
*/
public static function collapseWhitespace($str)
public static function collapseWhitespace($str, $encoding = null)
{
return $result = Stringy::create($str)->collapseWhitespace()->str;
return $result = Stringy::create($str, $encoding)->collapseWhitespace()->str;
}
/**

View File

@@ -249,16 +249,21 @@ class Stringy
/**
* Trims the string and replaces consecutive whitespace characters with a
* single space. This includes tabs and newline characters.
* single space. This includes tabs and newline characters, as well as
* multibyte whitespace such as the thin space and ideographic space.
*
* @return Stringy Object with a trimmed $str and condensed whitespace
*/
public function collapseWhitespace()
{
$stringy = self::create($this->str, $this->encoding);
$stringy->str = preg_replace('/\s+/u', ' ', $stringy->trim());
$regexEncoding = mb_regex_encoding();
mb_regex_encoding($this->encoding);
return $stringy;
$stringy = self::create($this->str, $this->encoding);
$stringy->str = mb_ereg_replace('[[:space:]]+', ' ', $stringy);
mb_regex_encoding($regexEncoding);
return $stringy->trim();
}
/**

View File

@@ -173,6 +173,8 @@ abstract class CommonTest extends PHPUnit_Framework_TestCase
array('test string', 'test string'),
array('Ο συγγραφέας', ' Ο συγγραφέας '),
array('123', ' 123 '),
array('1 2 3', '  1  2  3  ', 'UTF-8'), // ideographic spaces
array('', ' ', 'UTF-8'), // thin space and space
array('', ' '),
array('', ''),
);

View File

@@ -111,9 +111,9 @@ class StaticStringyTestCase extends CommonTest
/**
* @dataProvider stringsForCollapseWhitespace
*/
public function testCollapseWhitespace($expected, $str)
public function testCollapseWhitespace($expected, $str, $encoding = null)
{
$result = S::collapseWhitespace($str);
$result = S::collapseWhitespace($str, $encoding);
$this->assertInternalType('string', $result);
$this->assertEquals($expected, $result);
}

View File

@@ -145,9 +145,9 @@ class StringyTestCase extends CommonTest
/**
* @dataProvider stringsForCollapseWhitespace
*/
public function testCollapseWhitespace($expected, $str)
public function testCollapseWhitespace($expected, $str, $encoding = null)
{
$stringy = S::create($str);
$stringy = S::create($str, $encoding);
$result = $stringy->collapseWhitespace();
$this->assertInstanceOf('Stringy\Stringy', $result);
$this->assertEquals($expected, $result);