Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Twig : url_decode

I encoded an url parameter with the twig filter url_encode.

// app.request.query.get("date") output 01/04/2016

href="{{ path('page', {date: app.request.query.get("date")|url_encode}) }}">

which output in the url

date=01%252F04%252F2016

So in the requested page with url parameters

 {{ app.request.query.get("date") }}

display 01%2F04%2F2016 but i'd like to have 01/04/2016

I tried using raw filter and also did a twig extension :

<?php
namespace SE\AppBundle\Twig;

class htmlEntityDecodeExtension extends \Twig_Extension
{
    public function getFilters()
    {
        return array(
            new \Twig_SimpleFilter('html_entity_decode', array($this, 'htmlEntityDecode'))
        );
    }

    public function htmlEntityDecode($html)
    {
        $html = html_entity_decode($html);
        return $html;
    }

    public function getName()
    {
        return 'html_entity_decode_extension';
    }
}

But even with this it keeps displaying 01%2F04%2F2016

I get the same result in my controller method with :

echo html_entity_decode($request->query->get('date'));

What is the proper way to do this?

UPDATE :

the date is from an input of type 'text'. No this is a simple string with numbers and / .

like image 350
Brieuc Avatar asked Apr 09 '16 10:04

Brieuc


People also ask

How decode URL in PHP?

The urldecode() function is an inbuilt function in PHP which is used to decode url which is encoded by encoded() function. Parameters: This function accepts single parameter $input which holds the url to be decoded. Return Value: This function returns the decoded string on success.


1 Answers

There's no need to url-encode the parameter of the query string in the first place, as it's already done by the function that generate the path.

01%252F04%252F2016 is doubly urlencoded. PHP, when gets the request, already decode that value to 01%2F04%2F2016, but since you encoded it twice, it's still urlencoded. You need to use urldecode function to decode it. Or even better: don't urlencode it twice.

It's fine:

{{ path('page', {date: app.request.query.get("date")}) }}

UPDATE

Found this in the source code:

// "/" and "?" can be left decoded for better user experience, see
// http://tools.ietf.org/html/rfc3986#section-3.4
$url .= '?'.(false === strpos($query, '%2F') ? $query : strtr($query, array('%2F' => '/')));

So, the / is left deliberately url-decoded.

like image 109
Federkun Avatar answered Oct 08 '22 06:10

Federkun