summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--includes/path.inc20
-rw-r--r--modules/block/block.module5
2 files changed, 22 insertions, 3 deletions
diff --git a/includes/path.inc b/includes/path.inc
index 898b39048..d9774f93e 100644
--- a/includes/path.inc
+++ b/includes/path.inc
@@ -220,3 +220,23 @@ function drupal_is_front_page() {
// we can check it against the 'site_frontpage' variable.
return $_GET['q'] == drupal_get_normal_path(variable_get('site_frontpage', 'node'));
}
+
+/**
+ * Check if a path matches any pattern in a set of patterns.
+ *
+ * @param $path
+ * The path to match.
+ * @param $patterns
+ * String containing a set of patterns separated by \n, \r or \r\n.
+ *
+ * @return
+ * Boolean value: TRUE if the path matches a pattern, FALSE otherwise.
+ */
+function drupal_match_path($path, $patterns) {
+ static $regexps;
+
+ if (!isset($regexps[$patterns])) {
+ $regexps[$patterns] = '/^('. preg_replace(array('/(\r\n?|\n)/', '/\\\\\*/', '/(^|\|)\\\\<front\\\\>($|\|)/'), array('|', '.*', '\1'. preg_quote(variable_get('site_frontpage', 'node'), '/') .'\2'), preg_quote($patterns, '/')) .')$/';
+ }
+ return preg_match($regexps[$patterns], $path);
+}
diff --git a/modules/block/block.module b/modules/block/block.module
index 5c8f354ce..1b4557b93 100644
--- a/modules/block/block.module
+++ b/modules/block/block.module
@@ -410,11 +410,10 @@ function block_list($region) {
if ($block->pages) {
if ($block->visibility < 2) {
$path = drupal_get_path_alias($_GET['q']);
- $regexp = '/^('. preg_replace(array('/(\r\n?|\n)/', '/\\\\\*/', '/(^|\|)\\\\<front\\\\>($|\|)/'), array('|', '.*', '\1'. preg_quote(variable_get('site_frontpage', 'node'), '/') .'\2'), preg_quote($block->pages, '/')) .')$/';
// Compare with the internal and path alias (if any).
- $page_match = preg_match($regexp, $path);
+ $page_match = drupal_match_path($path, $block->pages);
if ($path != $_GET['q']) {
- $page_match = $page_match || preg_match($regexp, $_GET['q']);
+ $page_match = $page_match || drupal_match_path($_GET['q'], $block->pages);
}
// When $block->visibility has a value of 0, the block is displayed on
// all pages except those listed in $block->pages. When set to 1, it