您正在寻找的是对通配符的支持(https://github.com/begin/globbing#wildcards)。不幸的是,Drupal 不支持开箱即用的 globbing。
在现代通配符实现中,*
将匹配除 之外的任何字符/
,**
并将匹配任何字符,包括/
.
为了实施这种支持,需要:
看看PathMatcher
(core/lib/Drupal/Core/Path/PathMatcher.php)服务如何匹配路径。
将其扩展到自己的自定义服务中,只会matchPath()
被覆盖。
用下面的代码替换 的内容matchPath()
(这是原件的副本,matchPath()
有一些改动)。
更改包含的服务以使用您的自定义路径匹配(仅用于块或整个站点)。
更新块的配置以**
用于完整路径匹配和*
仅用于子路径。
/**
* {@inheritdoc}
*/
public function matchPath($path, $patterns) {
if (!isset($this->regexes[$patterns])) {
// Convert path settings to a regular expression.
$to_replace = [
// Replace newlines with a logical 'or'.
'/(\r\n?|\n)/',
'/\\\\\*\\\\\*/',
// Quote asterisks.
'/\\\\\*/',
// Quote <front> keyword.
'/(^|\|)\\\\<front\\\\>($|\|)/',
];
$replacements = [
'|',
'.*',
'[^\/]*',
'\1' . preg_quote($this->getFrontPagePath(), '/') . '\2',
];
$patterns_quoted = preg_quote($patterns, '/');
$this->regexes[$patterns] = '/^(' . preg_replace($to_replace, $replacements, $patterns_quoted) . ')$/';
}
return (bool) preg_match($this->regexes[$patterns], $path);
}
请注意,此代码仅添加额外的标记替换**
并更改*
标记的作用(除 之外的任何字符/
)。