5

小枝フィルター url_encode で url パラメーターをエンコードしました。

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

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

URLに出力する

date=01%252F04%252F2016

したがって、URLパラメーターを含む要求されたページで

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

01%2F04%2F2016 と表示されますが、01/04/2016 が必要です

生フィルターを使用してみましたが、小枝拡張も行いました:

<?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';
    }
}

しかし、これでも 01%2F04%2F2016 を表示し続けます

コントローラーメソッドで同じ結果が得られます:

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

これを行う適切な方法は何ですか?

アップデート :

日付は「テキスト」タイプの入力からのものです。いいえ、これは数字と / を含む単純な文字列です。

4

1 に答える 1

5

パスを生成する関数によって既に行われているため、最初にクエリ文字列のパラメーターを URL エンコードする必要はありません。

01%252F04%252F2016二重に urlencode されています。PHP は、リクエストを取得すると、すでにその値を にデコードしていますが01%2F04%2F2016、2 回エンコードしたため、まだ urlencoded のままです。urldecode関数を使用してデコードする必要があります。またはさらに良いこと: 2 回 urlencode しないでください。

大丈夫だよ:

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

アップデート

ソースコードでこれを見つけました:

// "/" 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' => '/')));

そのため、/意図的に URL デコードされたままになっています。

于 2016-04-09T10:36:44.477 に答える