Symfony1有一个名为auto_link_text()
的辅助函数,该函数解析了一段文本并将所有文本网址包装在<a>
个标记中,自动填充href
属性。
Twig是否包含这样的功能?我查看了Google,并查看了代码,但找不到代码。我显然可以自己编写一个代码,但如果它已经存在,我不想复制它。
如果我自己编写代码,它应该是函数还是过滤器?
答案 0 :(得分:14)
该功能在树枝中不存在,但您甚至可以将自己的扩展添加到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;
}
}
答案 1 :(得分:10)
如果您在Symfony2中使用twig,那么就有一个包:https://github.com/liip/LiipUrlAutoConverterBundle
如果您在Symfony2之外使用它,您可以向他们提交PR以便将捆绑和枝条扩展分离!
答案 2 :(得分:1)
其他列出的“答案”有点过时并且有问题。该版本将在最新版本的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;
}
}