9

Symfony1には、と呼ばれるヘルパー関数がありました。この関数はauto_link_text()、テキストのブロックを解析し、すべてのテキストURLをタグでラップして、属性<a>を自動的に入力します。href

Twigにはこのような機能が含まれていますか?Googleを調べてコードを調べましたが、見つかりません。私は明らかに自分でコーディングすることができますが、すでにそこにある場合は何かを複製したくありません。

自分でコーディングする場合、それは関数またはフィルターのどちらにする必要がありますか?

4

3 に答える 3

17

この関数はtwigには存在しませんが、Twigに独自の拡張機能を追加することもできます。

class AutoLinkTwigExtension extends \Twig_Extension
{

    public function getFilters()
    {
        return array('auto_link_text' => new \Twig_Filter_Method($this, 'auto_link_text', array('is_safe' => array('html'))),
        );
    }

    public function getName()
    {
        return "auto_link_twig_extension";
    }

    static public function auto_link_text($string)
    {

        $regexp = "/(<a.*?>)?(https?)?(:\/\/)?(\w+\.)?(\w+)\.(\w+)(<\/a.*?>)?/i";
        $anchorMarkup = "<a href=\"%s://%s\" target=\"_blank\" >%s</a>";

        preg_match_all($regexp, $string, $matches, \PREG_SET_ORDER);

        foreach ($matches as $match) {
            if (empty($match[1]) && empty($match[7])) {
                $http = $match[2]?$match[2]:'http';
                $replace = sprintf($anchorMarkup, $http, $match[0], $match[0]);
                $string = str_replace($match[0], $replace, $string);
            }
        }

        return $string;
    }
}
于 2012-05-26T20:11:41.007 に答える
10

Symfony2内で小枝を使用している場合は、そのためのバンドルがあります:https ://github.com/liip/LiipUrlAutoConverterBundle

Symfony2の外部で使用している場合は、バンドルと小枝エクステンションを分離するためにPRを送信できます。

于 2012-10-22T03:59:43.567 に答える
3

リストされている他の「回答」は少し古く、問題があります。これはSymfonyの最新バージョンで動作し、問題が少なくなります

class AutoLinkTwigExtension extends AbstractExtension
{
    public function getFilters()
    {
        return [new TwigFilter('auto_link', [$this, 'autoLink'], [
            'pre_escape'=>'html',
            'is_safe' => ['html']])];
    }

    static public function autoLink($string)
    {
        $pattern = "/http[s]?:\/\/[a-zA-Z0-9.\-\/?#=&]+/";
        $replacement = "<a href=\"$0\" target=\"_blank\">$0</a>";
        $string = preg_replace($pattern, $replacement, $string);
        return $string;
    }
}
于 2020-11-13T04:16:53.963 に答える