Skip to content

Commit

Permalink
[Form] moved data trimming logic of TrimListener into StringUtil
Browse files Browse the repository at this point in the history
  • Loading branch information
issei-m authored and webmozart committed Jun 22, 2015
1 parent 351174b commit f42c777
Show file tree
Hide file tree
Showing 5 changed files with 117 additions and 68 deletions.
1 change: 1 addition & 0 deletions src/Symfony/Component/Form/CHANGELOG.md
Expand Up @@ -8,6 +8,7 @@ CHANGELOG
* added the html5 "range" FormType
* deprecated the "cascade_validation" option in favor of setting "constraints"
with the Valid constraint
* moved data trimming logic of TrimListener into StringUtil

2.7.0
-----
Expand Down
Expand Up @@ -14,6 +14,7 @@
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Form\Util\StringUtil;

/**
* Trims string data.
Expand All @@ -30,11 +31,7 @@ public function preSubmit(FormEvent $event)
return;
}

if (null !== $result = @preg_replace('/^[\pZ\p{Cc}]+|[\pZ\p{Cc}]+$/u', '', $data)) {
$event->setData($result);
} else {
$event->setData(trim($data));
}
$event->setData(StringUtil::trim($data));
}

/**
Expand Down
Expand Up @@ -39,67 +39,4 @@ public function testTrimSkipNonStrings()

$this->assertSame(1234, $event->getData());
}

/**
* @dataProvider spaceProvider
*/
public function testTrimUtf8Separators($hex)
{
if (!function_exists('mb_convert_encoding')) {
$this->markTestSkipped('The "mb_convert_encoding" function is not available');
}

// Convert hexadecimal representation into binary
// H: hex string, high nibble first (UCS-2BE)
// *: repeat until end of string
$binary = pack('H*', $hex);

// Convert UCS-2BE to UTF-8
$symbol = mb_convert_encoding($binary, 'UTF-8', 'UCS-2BE');
$symbol = $symbol."ab\ncd".$symbol;

$form = $this->getMock('Symfony\Component\Form\Test\FormInterface');
$event = new FormEvent($form, $symbol);

$filter = new TrimListener();
$filter->preSubmit($event);

$this->assertSame("ab\ncd", $event->getData());
}

public function spaceProvider()
{
return array(
// separators
array('0020'),
array('00A0'),
array('1680'),
// array('180E'),
array('2000'),
array('2001'),
array('2002'),
array('2003'),
array('2004'),
array('2005'),
array('2006'),
array('2007'),
array('2008'),
array('2009'),
array('200A'),
array('2028'),
array('2029'),
array('202F'),
array('205F'),
array('3000'),
// controls
array('0009'),
array('000A'),
array('000B'),
array('000C'),
array('000D'),
array('0085'),
// zero width space
// array('200B'),
);
}
}
72 changes: 72 additions & 0 deletions src/Symfony/Component/Form/Tests/Util/StringUtilTest.php
@@ -0,0 +1,72 @@
<?php

namespace Symfony\Component\Form\Tests\Util;

use Symfony\Component\Form\Util\StringUtil;

class StringUtilTest extends \PHPUnit_Framework_TestCase
{
public function testTrim()
{
$data = ' Foo! ';

$this->assertEquals('Foo!', StringUtil::trim($data));
}

/**
* @dataProvider spaceProvider
*/
public function testTrimUtf8Separators($hex)
{
if (!function_exists('mb_convert_encoding')) {
$this->markTestSkipped('The "mb_convert_encoding" function is not available');
}

// Convert hexadecimal representation into binary
// H: hex string, high nibble first (UCS-2BE)
// *: repeat until end of string
$binary = pack('H*', $hex);

// Convert UCS-2BE to UTF-8
$symbol = mb_convert_encoding($binary, 'UTF-8', 'UCS-2BE');
$symbol = $symbol."ab\ncd".$symbol;

$this->assertSame("ab\ncd", StringUtil::trim($symbol));
}

public function spaceProvider()
{
return array(
// separators
array('0020'),
array('00A0'),
array('1680'),
// array('180E'),
array('2000'),
array('2001'),
array('2002'),
array('2003'),
array('2004'),
array('2005'),
array('2006'),
array('2007'),
array('2008'),
array('2009'),
array('200A'),
array('2028'),
array('2029'),
array('202F'),
array('205F'),
array('3000'),
// controls
array('0009'),
array('000A'),
array('000B'),
array('000C'),
array('000D'),
array('0085'),
// zero width space
// array('200B'),
);
}
}
42 changes: 42 additions & 0 deletions src/Symfony/Component/Form/Util/StringUtil.php
@@ -0,0 +1,42 @@
<?php

/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace Symfony\Component\Form\Util;

/**
* @author Issei Murasawa <issei.m7@gmail.com>
* @author Bernhard Schussek <bschussek@gmail.com>
*/
class StringUtil
{
/**
* This class should not be instantiated.
*/
private function __construct()
{
}

/**
* Returns the trimmed data.
*
* @param string $string
*
* @return string
*/
public static function trim($string)
{
if (null !== $result = @preg_replace('/^[\pZ\p{Cc}]+|[\pZ\p{Cc}]+$/u', '', $string)) {
return $result;
}

return trim($string);
}
}

0 comments on commit f42c777

Please sign in to comment.