[CssSelector] fixed XPathExpr::xpathliteral()
This commit is contained in:
parent
241c779cf1
commit
13759a7fac
@ -173,28 +173,31 @@ class XPathExpr
|
|||||||
|
|
||||||
if (false === strpos($s, "'"))
|
if (false === strpos($s, "'"))
|
||||||
{
|
{
|
||||||
$s = sprintf("'%s'", $s);
|
return sprintf("'%s'", $s);
|
||||||
}
|
}
|
||||||
elseif (false === strpos($s, '"'))
|
|
||||||
|
if (false === strpos($s, '"'))
|
||||||
{
|
{
|
||||||
$s = sprintf('"%s"', $s);
|
return sprintf('"%s"', $s);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
$string = $s;
|
||||||
|
$parts = array();
|
||||||
|
while (true)
|
||||||
{
|
{
|
||||||
$tmp = array();
|
if (false !== $pos = strpos($string, "'"))
|
||||||
foreach (preg_split("#('+)#", $s) as $part)
|
|
||||||
{
|
{
|
||||||
if (!$part)
|
$parts[] = sprintf("'%s'", substr($string, 0, $pos));
|
||||||
{
|
$parts[] = "\"'\"";
|
||||||
continue;
|
$string = substr($string, $pos + 1);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
$tmp[] = sprintf(false !== strpos($part, "'") ? '"%s"' : "'%s'", $part);
|
{
|
||||||
|
$parts[] = "'$string'";
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
$s = sprintf("concat(%s)", implode($tmp, ','));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return $s;
|
return sprintf("concat(%s)", implode($parts, ', '));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
35
tests/Symfony/Tests/Components/CssSelector/XPathExprTest.php
Normal file
35
tests/Symfony/Tests/Components/CssSelector/XPathExprTest.php
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of the symfony package.
|
||||||
|
*
|
||||||
|
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Symfony\Tests\Components\CssSelector;
|
||||||
|
|
||||||
|
use Symfony\Components\CssSelector\XPathExpr;
|
||||||
|
|
||||||
|
class XPathExprTest extends \PHPUnit_Framework_TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @dataProvider getXPathLiteralValues
|
||||||
|
*/
|
||||||
|
public function testXpathLiteral($value, $literal)
|
||||||
|
{
|
||||||
|
$this->assertEquals($literal, XPathExpr::xpathLiteral($value));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getXPathLiteralValues()
|
||||||
|
{
|
||||||
|
return array(
|
||||||
|
array('foo', "'foo'"),
|
||||||
|
array("foo's bar", '"foo\'s bar"'),
|
||||||
|
array("foo's \"middle\" bar", 'concat(\'foo\', "\'", \'s "middle" bar\')'),
|
||||||
|
array("foo's 'middle' \"bar\"", 'concat(\'foo\', "\'", \'s \', "\'", \'middle\', "\'", \' "bar"\')'),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user