diff --git a/ecrire/inc/utils.php b/ecrire/inc/utils.php
index edf970ad1f24054e3cf763be2a0d9a0f6fad1324..50f6931622ac437ec917e92ccf7159296f160130 100644
--- a/ecrire/inc/utils.php
+++ b/ecrire/inc/utils.php
@@ -719,21 +719,41 @@ function nettoyer_uri($reset = null) {
  * Nettoie une request_uri des paramètres var_xxx
  *
  * Attention, la regexp doit suivre _CONTEXTE_IGNORE_VARIABLES défini au début de public/assembler.php
+ * @uses _CONTEXTE_IGNORE_LISTE_VARIABLES
  *
  * @param string $request_uri
  * @return string
  */
 function nettoyer_uri_var($request_uri) {
+	static $preg_nettoyer;
+	if (!defined('_CONTEXTE_IGNORE_LISTE_VARIABLES')) {
+		define('_CONTEXTE_IGNORE_LISTE_VARIABLES', ['^var_', '^PHPSESSID$', '^fbclid$', '^utm_']);
+	}
+	if (empty($preg_nettoyer)) {
+		$preg_nettoyer_vars = _CONTEXTE_IGNORE_LISTE_VARIABLES;
+		foreach ($preg_nettoyer_vars as &$var) {
+			if (str_starts_with($var, '^')) {
+				$var = substr($var, 1);
+			} else {
+				$var = '[^=&]*' . $var;
+			}
+			if (str_ends_with($var, '$')) {
+				$var = substr($var, 0, -1);
+			} else {
+				$var .= '[^=&]*';
+			}
+		}
+		$preg_nettoyer = ',([?&])(' . implode('|', $preg_nettoyer_vars) . ')=[^&]*(&|$),i';
+	}
+	if (empty($request_uri)) {
+		return $request_uri;
+	}
 	$uri1 = $request_uri;
 	do {
 		$uri = $uri1;
-		$uri1 = preg_replace(
-			',([?&])(var_[^=&]*|PHPSESSID|fbclid|utm_[^=&]*)=[^&]*(&|$),i',
-			'\1',
-			$uri
-		);
+		$uri1 = preg_replace($preg_nettoyer, '\1', $uri);
 	} while ($uri <> $uri1);
-	return preg_replace(',[?&]$,', '', $uri1);
+	return rtrim($uri1, '?&');
 }
 
 
diff --git a/ecrire/public/assembler.php b/ecrire/public/assembler.php
index fe63c686a9810fdebb6ba4406fd385c3930c20c8..fd7ec82ea55c0442caa589677d2b09547438ff0e 100644
--- a/ecrire/public/assembler.php
+++ b/ecrire/public/assembler.php
@@ -22,11 +22,6 @@ if (!defined('_ECRIRE_INC_VERSION')) {
 	return;
 }
 
-// En cas de modification, il faut aussi actualiser la regexp de nettoyer_uri_var() dans inc/utils.php
-if (!defined('_CONTEXTE_IGNORE_VARIABLES')) {
-	define('_CONTEXTE_IGNORE_VARIABLES', '/(^var_|^PHPSESSID$|^fbclid$|^utm_)/');
-}
-
 function assembler($fond, string $connect = '') {
 
 	$chemin_cache = null;
@@ -193,6 +188,9 @@ function assembler($fond, string $connect = '') {
 /**
  * Calcul le contexte de la page
  *
+ * @uses _CONTEXTE_IGNORE_LISTE_VARIABLES
+ * @see nettoyer_uri_var()
+ *
  * lors du calcul d'une page spip etablit le contexte a partir
  * des variables $_GET et $_POST, purgees des fausses variables var_*
  *
@@ -203,15 +201,22 @@ function assembler($fond, string $connect = '') {
  * @return array Un tableau du contexte de la page
  */
 function calculer_contexte() {
+	static $preg_ignore_variables;
+	if (empty($preg_ignore_variables)) {
+		if (!defined('_CONTEXTE_IGNORE_LISTE_VARIABLES')) {
+			nettoyer_uri_var('');
+		}
+		$preg_ignore_variables = '/(' . implode('|',_CONTEXTE_IGNORE_LISTE_VARIABLES) . ')/';
+	}
 
 	$contexte = [];
 	foreach ($_GET as $var => $val) {
-		if (!preg_match(_CONTEXTE_IGNORE_VARIABLES, $var)) {
+		if (!preg_match($preg_ignore_variables, $var)) {
 			$contexte[$var] = $val;
 		}
 	}
 	foreach ($_POST as $var => $val) {
-		if (!preg_match(_CONTEXTE_IGNORE_VARIABLES, $var)) {
+		if (!preg_match($preg_ignore_variables, $var)) {
 			$contexte[$var] = $val;
 		}
 	}