我已经搜索了很多关于这个主题的内容并且没有在网上找到太多内容所以我开始研究并创建一篇关于这个主题的完整文章但是我无法理解这里的一些内容,制作基本的自定义标签刀片很容易就像
@search @endsearch or @title('something')
但是如果我想做类似下面的事情
@cache('sidebar',10,[$silver,$gold,$platinum])
html tags come here
@endcache
目前我正在这样做
@cache('sidebar_',10,function() use ($silver_sidebar,$gold_sidebar))
@endcache
$pattern = Blade::createOpenMatcher('cache');
$replace = "<?php echo PageCache::cache$2 { ?>";
$view = preg_replace($pattern, $replace, $view);
// Replace closing tag
$view = str_replace('@endcache', '<?php }); ?>', $view);
如何解析它以分离三个参数并获得end和start标记之间的内容?非常感谢您的帮助。谢谢你的回复。
答案 0 :(得分:3)
这个问题已经超过1年了,但如果将来有人需要,我会分享一个解决方案。
使用第一个例子:
@cache('sidebar', 10, [ $silver, $gold, $platinum ])
html tags come here
@endcache
可以这样做:
Blade::extend(function ($view) {
$pattern = Blade::createOpenMatcher('cache');
$pattern = rtrim($pattern, '/') . '(.*?)@endcache/s';
$matches = [];
preg_match($pattern, $view, $matches);
$content = '';
if (count($matches) > 3) {
$content = addslashes($matches[3]);
}
$replace = "<?php echo PageCache::cache$2, '{$content}'); ?>";
$view = preg_replace($pattern, $replace, $view);
return $view;
});
解释代码:
@cache
和@endcache
之间的内容。请注意在表达式中使用 s
修饰符。这样我们就可以使用.
(点)匹配多行。count($matches)
检查表达式是否与某些内容匹配,并将其指定给$content
。这样您就可以在函数中获取代码(@cache
和@endcache
)之间的内容:
class PageCache {
public static function cache($name, $num, $args, $content) {
return stripslashes($content);
}
}
根据上面的例子,您将拥有:
$name = 'sidebar';
$num = 10;
$args = [ $silver, $gold, $platinum ];
我也只是在我的例子中返回内容,但你可以在那里做一些更有趣的事情。