diff --git a/ecrire/base/repair.php b/ecrire/base/repair.php
index a34a7e2e0c63b6f5e8b641ebeea408247f52e226..e330c776403ca39973fdc08a9470928406b1a01a 100644
--- a/ecrire/base/repair.php
+++ b/ecrire/base/repair.php
@@ -109,7 +109,7 @@ function admin_repair_tables() {
 			&& !str_contains($msg, ' OK ')
 		) {
 			$class = " class='notice'";
-			$m .= '<br /><tt>' . spip_htmlentities($msg) . "</tt>\n";
+			$m .= '<br><tt>' . spip_htmlentities($msg) . "</tt>\n";
 		} else {
 			$m .= ' ' . _T('texte_table_ok');
 		}
diff --git a/ecrire/base/upgrade.php b/ecrire/base/upgrade.php
index 12032cc126cdd9ddb0625bd3e197ab708bb791bb..43fb22da7f9f2ef662b8ab7fd99bd74aee65351e 100644
--- a/ecrire/base/upgrade.php
+++ b/ecrire/base/upgrade.php
@@ -390,7 +390,7 @@ function maj_while($installee, $cible, $maj, $meta = '', $table = 'meta', $redir
 			if ($meta) {
 				ecrire_meta($meta, $installee = $v, 'oui', $table);
 			}
-			echo (_IS_CLI ? "\n" : '<br />');
+			echo (_IS_CLI ? "\n" : '<br>');
 		}
 		if (time() >= _TIME_OUT) {
 			relance_maj($meta, $table, $redirect);
diff --git a/ecrire/exec/admin_plugin.php b/ecrire/exec/admin_plugin.php
index 034ed096aadf1220f58ae13b583cc8802aaa2d20..ebdc3629d8253d36b5c05b49d3511a2a3497bd01 100644
--- a/ecrire/exec/admin_plugin.php
+++ b/ecrire/exec/admin_plugin.php
@@ -265,7 +265,7 @@ function affiche_les_plugins_verrouilles($actifs) {
 		. debut_cadre_trait_couleur('', true, '', _T('plugins_liste_dist'), 'liste_plugins_dist')
 		. '<p>'
 		. _T('plugin_info_plugins_dist_1', ['plugins_dist' => joli_repertoire(_DIR_PLUGINS_DIST)])
-		. '<br />' . _T('plugin_info_plugins_dist_2')
+		. '<br>' . _T('plugin_info_plugins_dist_2')
 		. '</p>'
 		. $liste
 		. fin_cadre_trait_couleur()
diff --git a/ecrire/exec/fond.php b/ecrire/exec/fond.php
index 323f336819eec97546fe117d2f8e90ad14f110a3..ebe31e476a05293b3b60a30d48fab0ee66a0539b 100644
--- a/ecrire/exec/fond.php
+++ b/ecrire/exec/fond.php
@@ -56,7 +56,7 @@ function shutdown_error() {
 				ob_end_flush();
 
 			var_dump(error_get_last());
-			#echo "<hr />"."Erreur fatale (memoire ?)<hr />";
+			#echo "<hr>"."Erreur fatale (memoire ?)<hr>";
 			@flush();
 		}*/
 }
diff --git a/ecrire/exec/rechercher.php b/ecrire/exec/rechercher.php
index 558b2cc1ac92c2f5826e04f4977312c7abea58c3..836c62efea5bb0489f75ecd30b8c4be07d265d71 100644
--- a/ecrire/exec/rechercher.php
+++ b/ecrire/exec/rechercher.php
@@ -132,7 +132,7 @@ function exec_rechercher_args($id, $type, $exclus, $rac, $do) {
 function proposer_item($ids, $titles, $rac, $type, $do) {
 
 	if (!$ids) {
-		return "<br /><br /><div style='padding: 5px; color: red;'><b>"
+		return "<br><br><div style='padding: 5px; color: red;'><b>"
 		. spip_htmlentities($type)
 		. '</b> :  ' . _T('avis_aucun_resultat') . '</div>';
 	}
diff --git a/ecrire/exec/upgrade.php b/ecrire/exec/upgrade.php
index 9ff96bcee606e557ce21aec1950e70f0c777f3e1..1e2605fe5d262851c7367021ac5f4721d2919e48 100644
--- a/ecrire/exec/upgrade.php
+++ b/ecrire/exec/upgrade.php
@@ -78,7 +78,7 @@ function exec_upgrade_dist() {
 			$commentaire = _T('texte_mise_a_niveau_base_1');
 		}
 
-		$commentaire .= '<br />[' . $GLOBALS['meta']['version_installee'] . '/' . $GLOBALS['spip_version_base'] . ']';
+		$commentaire .= '<br>[' . $GLOBALS['meta']['version_installee'] . '/' . $GLOBALS['spip_version_base'] . ']';
 
 		$_POST['reinstall'] = 'non'; // pour copy_request dans admin
 		include_spip('inc/headers');
diff --git a/ecrire/genie/maintenance.php b/ecrire/genie/maintenance.php
index 9f63da548f2dbfaef40fd27011a3e304748b57ba..1531781345344a7a20535904fcfa301cf9e872c3 100644
--- a/ecrire/genie/maintenance.php
+++ b/ecrire/genie/maintenance.php
@@ -108,8 +108,8 @@ function verifier_crash_tables() {
 function message_crash_tables() {
 	if ($crash = verifier_crash_tables()) {
 		return
-			'<strong>' . _T('texte_recuperer_base') . '</strong><br />'
-			. ' <tt>' . implode(', ', $crash) . '</tt><br />'
+			'<strong>' . _T('texte_recuperer_base') . '</strong><br>'
+			. ' <tt>' . implode(', ', $crash) . '</tt><br>'
 			. generer_form_ecrire(
 				'base_repair',
 				_T('texte_crash_base'),
diff --git a/ecrire/inc/admin.php b/ecrire/inc/admin.php
index 738c1933cd94f4d9695051f69d96283e704368f3..26ec08555ab2dfeaacf9b97f201327a93b6a1d97 100644
--- a/ecrire/inc/admin.php
+++ b/ecrire/inc/admin.php
@@ -297,7 +297,7 @@ function copy_request($script, $suite, $submit = '') {
 		if (!in_array($n, ['fichier', 'exec', 'validation_admin']) && !is_array($c)) {
 			$suite .= "\n<input type='hidden' name='" . spip_htmlspecialchars($n) . "' value='" .
 				entites_html($c) .
-				"'  />";
+				"' >";
 		}
 	}
 
diff --git a/ecrire/inc/auth.php b/ecrire/inc/auth.php
index 9b60fd9245c4f075d35eaf8b1ae1b9897d9f2d96..67b1bcb63c7ec22151d1b98885aa9339eaf8c906 100644
--- a/ecrire/inc/auth.php
+++ b/ecrire/inc/auth.php
@@ -111,7 +111,7 @@ function auth_echec($raison) {
 			_T('avis_erreur_connexion'),
 			_T('avis_erreur_visiteur')
 				// Lien vers le site public
-				. '<br /><a href="' . attribut_url(url_de_base()) . '">' . _T('login_retour_public') . '</a>'
+				. '<br><a href="' . attribut_url(url_de_base()) . '">' . _T('login_retour_public') . '</a>'
 				// Si la personne est connectée, lien de déconnexion ramenant vers la page de login
 				. ($est_connecte ? ' | <a href="' . generer_url_public('', 'action=logout&amp;logout=prive') . '">' . _T('icone_deconnecter') . '</a>' : '')
 		);
@@ -120,7 +120,7 @@ function auth_echec($raison) {
 		$h = $raison['site'];
 		$raison = minipres(
 			_T('avis_erreur_connexion'),
-			'<br /><br /><p>'
+			'<br><br><p>'
 			. _T('texte_inc_auth_1', ['auth_login' => $raison['login']])
 			. " <a href='" . attribut_url($h) . "'>"
 			. _T('texte_inc_auth_2')
diff --git a/ecrire/inc/chercher_rubrique.php b/ecrire/inc/chercher_rubrique.php
index 7fda26c213f063e617d27145cd9bf4efd1c34aa6..3d29c577ca9627487a30f91225e627f1d54bfb42 100644
--- a/ecrire/inc/chercher_rubrique.php
+++ b/ecrire/inc/chercher_rubrique.php
@@ -257,7 +257,7 @@ function selecteur_rubrique_html($id_rubrique, $type, $restreint, $idem = 0) {
 
 	# message pour neuneus (a supprimer ?)
 #	if ($type != 'auteur' AND $type != 'breve')
-#		$r .= "\n<br />"._T('texte_rappel_selection_champs');
+#		$r .= "\n<br>"._T('texte_rappel_selection_champs');
 
 	return $r;
 }
diff --git a/ecrire/inc/cvt_configurer.php b/ecrire/inc/cvt_configurer.php
index c238153659d73c18b25f47fcb32398b6a6c393fc..df9736681b2cee810ab2805ebf18ca31e5c3b2af 100644
--- a/ecrire/inc/cvt_configurer.php
+++ b/ecrire/inc/cvt_configurer.php
@@ -235,7 +235,7 @@ function cvtconf_configurer_stocker($form, $valeurs, $store) {
 	foreach ($store as $k => $v) {
 		ecrire_config("$stockage$table$prefixe$casier$k", $v);
 		if (_request('var_mode') == 'configurer' && autoriser('webmestre')) {
-			$trace .= "<br />table $table : " . $prefixe . $k . " = $v;";
+			$trace .= "<br>table $table : " . $prefixe . $k . " = $v;";
 		}
 	}
 
diff --git a/ecrire/inc/documents.php b/ecrire/inc/documents.php
index d11d57365d69ae46de4d5d2dfbf1198e6c63a8f8..cc0680f40277243f203d184cd58d937d374a5725 100644
--- a/ecrire/inc/documents.php
+++ b/ecrire/inc/documents.php
@@ -309,7 +309,7 @@ function check_upload_error($error, $msg = '', $return = false) {
 		default: /* autre */
 			if (!$msg) {
 				$msg = _T('pass_erreur') . ' ' . $error
-					. '<br />' . propre('[->http://php.net/manual/fr/features.file-upload.errors.php]');
+					. '<br>' . propre('[->http://php.net/manual/fr/features.file-upload.errors.php]');
 			}
 			break;
 	}
diff --git a/ecrire/inc/editer.php b/ecrire/inc/editer.php
index 4c5cc5acb239294533db4d3e74c3832b6759042f..2f106694a22cc32c7719326dd312cbe19f072c58 100644
--- a/ecrire/inc/editer.php
+++ b/ecrire/inc/editer.php
@@ -139,7 +139,7 @@ function formulaires_editer_objet_verifier($type, $id = 'new', $oblis = []) {
 				if (!isset($erreurs[$champ])) {
 					$erreurs[$champ] = '';
 				}
-				$erreurs[$champ] .= _T('alerte_modif_info_concourante') . "<br /><textarea readonly='readonly' class='forml'>" . entites_html($conflit['base']) . '</textarea>';
+				$erreurs[$champ] .= _T('alerte_modif_info_concourante') . "<br><textarea readonly='readonly' class='forml'>" . entites_html($conflit['base']) . '</textarea>';
 			}
 		}
 	}
diff --git a/ecrire/inc/filtres.php b/ecrire/inc/filtres.php
index 45e63199d16c3a65a73d3171adada92ce248067b..55b4f0921ea06b470d6270ee8bcd3d906b31d3a9 100644
--- a/ecrire/inc/filtres.php
+++ b/ecrire/inc/filtres.php
@@ -561,7 +561,7 @@ function image_filtrer($args) {
  * Pour les filtres `largeur` et `hauteur` `taille_image` et `poids_image`
  *
  * @param string $img
- *     Balise HTML `<img ... />` ou chemin de l'image (qui peut être une URL distante).
+ *     Balise HTML `<img ...>` ou chemin de l'image (qui peut être une URL distante).
  * @return array
  *     largeur
  *     hauteur
@@ -665,7 +665,7 @@ function infos_image($img, $force_refresh = false) {
  * Pour les filtres `largeur` et `hauteur`
  *
  * @param string $img
- *     Balise HTML `<img ... />` ou chemin de l'image (qui peut être une URL distante).
+ *     Balise HTML `<img ...>` ou chemin de l'image (qui peut être une URL distante).
  * @return array
  *     largeur
  *     hauteur
@@ -690,7 +690,7 @@ function taille_image($img, $force_refresh = false) {
  * @see  hauteur()
  *
  * @param string $img
- *     Balise HTML `<img ... />` ou chemin de l'image (qui peut être une URL distante).
+ *     Balise HTML `<img ...>` ou chemin de l'image (qui peut être une URL distante).
  * @return int|null
  *     Largeur en pixels, NULL ou 0 si aucune image.
  */
@@ -712,7 +712,7 @@ function largeur($img) {
  * @see  largeur()
  *
  * @param string $img
- *     Balise HTML `<img ... />` ou chemin de l'image (qui peut être une URL distante).
+ *     Balise HTML `<img ...>` ou chemin de l'image (qui peut être une URL distante).
  * @return int|null
  *     Hauteur en pixels, NULL ou 0 si aucune image.
  */
@@ -1225,9 +1225,9 @@ function PtoBR($texte) {
 	}
 	$u = $GLOBALS['meta']['pcre_u'];
 	$texte = preg_replace('@</p>@iS', "\n", $texte);
-	$texte = preg_replace("@<p\b.*>@UiS", '<br />', $texte);
+	$texte = preg_replace("@<p\b.*>@UiS", '<br>', $texte);
 
-	return preg_replace('@^\s*<br />@S' . $u, '', $texte);
+	return preg_replace('@^\s*<br>@S' . $u, '', $texte);
 }
 
 /**
@@ -3710,7 +3710,7 @@ function filtre_balise_svg_dist($img, $alt = '', $class = null, $size = null) {
  * @uses filtre_balise_svg_dist()
  *
  * @param string $img
- *   chemin vers un fichier ou balise `<img src='...' />` (generee par un filtre image par exemple)
+ *   chemin vers un fichier ou balise `<img src='...'>` (generee par un filtre image par exemple)
  * @param string $alt
  *   texte alternatif ; une valeur nulle pour explicitement ne pas avoir de balise alt sur l'image (au lieu d'un alt vide)
  * @param string $class
@@ -4851,7 +4851,7 @@ function wrap($texte, $wrap) {
  *
  * Les textes sont retournes avec simplement mise en forme typo
  *
- * le $join sert a separer les items d'un tableau, c'est en general un \n ou <br /> selon si on fait du html ou du texte
+ * le $join sert a separer les items d'un tableau, c'est en general un \n ou <br> selon si on fait du html ou du texte
  * les tableaux-listes (qui n'ont que des cles numeriques), sont affiches sous forme de liste separee par des virgules :
  * c'est VOULU !
  *
@@ -4860,7 +4860,7 @@ function wrap($texte, $wrap) {
  * @param int $indent
  * @return array|mixed|string
  */
-function filtre_print_dist($u, $join = '<br />', $indent = 0) {
+function filtre_print_dist($u, $join = '<br>', $indent = 0) {
 	if (is_string($u)) {
 		return typo($u);
 	}
diff --git a/ecrire/inc/filtres_images_lib_mini.php b/ecrire/inc/filtres_images_lib_mini.php
index d96d7c21474cdaaadb38c4eeddf682ba9b547dc2..8e57a2c169ccc86ad027b93363a6ee8a35f5cf41 100644
--- a/ecrire/inc/filtres_images_lib_mini.php
+++ b/ecrire/inc/filtres_images_lib_mini.php
@@ -269,7 +269,7 @@ function statut_effacer_images_temporaires($stat) {
  * @uses reconstruire_image_intermediaire()
  *
  * @param string $img
- *     Chemin de l'image ou balise html `<img src=... />`.
+ *     Chemin de l'image ou balise html `<img src=...>`.
  * @param string $effet
  *     Les nom et paramètres de l'effet à apporter sur l'image
  *     (par exemple : reduire-300-200).
diff --git a/ecrire/inc/filtres_images_mini.php b/ecrire/inc/filtres_images_mini.php
index 05164aed46d53e969ca173a7ca02fe7786976cdf..0642c1fac973a21fa1648efcf99f64592650f887 100644
--- a/ecrire/inc/filtres_images_mini.php
+++ b/ecrire/inc/filtres_images_mini.php
@@ -289,7 +289,7 @@ function couleur_eclaircir($couleur, $coeff = 0.5) {
  * dans la fonction image_filtrer
  *
  * @param string $img
- *    Un tag html `<img src=... />`.
+ *    Un tag html `<img src=...>`.
  * @param int $width_min
  *    Largeur minimale de l'image à traiter (0 par défaut)
  * @param int $height_min
@@ -299,7 +299,7 @@ function couleur_eclaircir($couleur, $coeff = 0.5) {
  * @param int $height_max
  *    Hauteur minimale de l'image à traiter (10000 par défaut)
  * @return
- *    Le tag html `<img src=... />` avec une class `filtre_inactif` ou pas
+ *    Le tag html `<img src=...>` avec une class `filtre_inactif` ou pas
  */
 function image_select($img, $width_min = 0, $height_min = 0, $width_max = 10000, $height_max = 1000) {
 	if (!$img) {
diff --git a/ecrire/inc/headers.php b/ecrire/inc/headers.php
index 4983e407e5d6e32b3de226774ebc863f37a8e005..2e4e26bb558d3d4fc6c5fcda383012ac8892fedd 100644
--- a/ecrire/inc/headers.php
+++ b/ecrire/inc/headers.php
@@ -155,7 +155,7 @@ function redirige_formulaire($url, $equiv = '', $format = 'message') {
 				// on renvoie un lien masque qui sera traite par ajaxCallback.js
 				'<a href="' . attribut_url($url) . '" name="ajax_redirect"  style="display:none;">' . _T('navigateur_pas_redirige') . '</a>',
 				// et un message au cas ou
-				'<br /><a href="' . attribut_url($url) . '">' . _T('navigateur_pas_redirige') . '</a>'
+				'<br><a href="' . attribut_url($url) . '">' . _T('navigateur_pas_redirige') . '</a>'
 			];
 		} else // format message texte, tout en js inline
 		{
@@ -163,7 +163,7 @@ function redirige_formulaire($url, $equiv = '', $format = 'message') {
 				// ie poste les formulaires dans une iframe, il faut donc rediriger son parent
 				"<script>if (parent.window){parent.window.document.location.replace(\"$url\");} else {document.location.replace(\"$url\");}</script>"
 				. http_img_pack('loader.svg', '', " class='loader'")
-				. '<br />'
+				. '<br>'
 				. '<a href="' . attribut_url($url) . '">' . _T('navigateur_pas_redirige') . '</a>';
 		}
 	}
diff --git a/ecrire/inc/install.php b/ecrire/inc/install.php
index 3fe2480b2adda887e7faa5f7c335e001077e9d20..93480da55455c5974990bd077c4a76ed19c53153 100644
--- a/ecrire/inc/install.php
+++ b/ecrire/inc/install.php
@@ -300,7 +300,7 @@ function fieldset_champs($champs = []) {
 					. "/>\n";
 				$fieldset .= "<label for='$nom-$valeur'>" . $label . "</label>\n";
 			}
-			$fieldset .= "<br />\n";
+			$fieldset .= "<br>\n";
 		} else {
 			$fieldset .= "<label for='" . $nom . "'>" . $contenu['label'] . "</label>\n";
 			$fieldset .= '<input ' . $class . "type='" . $type . "' id='" . $nom . "' name='" . $nom . "'\nvalue='" . $contenu['valeur'] . "'"
@@ -400,7 +400,7 @@ function install_connexion_form($db, $login, #[\SensitiveParameter] $pass, $pred
 				. '<p class="explication">'
 				. _T('install_types_db_connus')
 				// Passer l'avertissement SQLIte en  commentaire, on pourra facilement le supprimer par la suite sans changer les traductions.
-				// . "<br /><small>(". _T('install_types_db_connus_avertissement') .')</small>'
+				// . "<br><small>(". _T('install_types_db_connus_avertissement') .')</small>'
 				. '</p>'
 				. "\n<div class='p'>\n<ul>\n"
 				. implode("\n", install_select_serveur())
@@ -506,7 +506,7 @@ function install_etape_liste_bases($server_db, $login_db, $disabled = []) {
 		) {
 			$checked = "<input$base checked='checked'>\n$label";
 		} else {
-			$bases[] = "<input$base />\n$label";
+			$bases[] = "<input$base>\n$label";
 		}
 	}
 
diff --git a/ecrire/inc/math.php b/ecrire/inc/math.php
index ad7081a903dd001969a8300e399b1618a7b6e73d..dd94f97bf8867ee0193ba4618290f7ee21ed907d 100644
--- a/ecrire/inc/math.php
+++ b/ecrire/inc/math.php
@@ -63,7 +63,7 @@ function produire_image_math($tex) {
 			[, , , $size] = @spip_getimagesize($fichier);
 			$alt = "alt=\"$tex\" title=\"$tex\"";
 
-			return "<img src=\"" . attribut_url($fichier) . "\" style=\"vertical-align:middle;\" $size $alt />";
+			return "<img src=\"" . attribut_url($fichier) . "\" style=\"vertical-align:middle;\" $size $alt>";
 		}
 	} else // pas de fichier
 	{
diff --git a/ecrire/inc/plugin.php b/ecrire/inc/plugin.php
index 520832ac6296d0600c88ca66504fc662f715bb7e..e525976d9ff34ef8d9ee3b8fe398a935b2dec3e6 100644
--- a/ecrire/inc/plugin.php
+++ b/ecrire/inc/plugin.php
@@ -756,7 +756,7 @@ function plugin_controler_lib($lib, $url) {
 	/* Feature sortie du core, voir STP
 	 * if ($url) {
 		include_spip('inc/charger_plugin');
-		$url = '<br />'	. bouton_telechargement_plugin($url, 'lib');
+		$url = '<br>'	. bouton_telechargement_plugin($url, 'lib');
 	}*/
 	return _T('plugin_necessite_lib', ['lib' => $lib]) . " <a href='" . attribut_url($url) . "'>$url</a>";
 }
diff --git a/ecrire/inc/presentation_mini.php b/ecrire/inc/presentation_mini.php
index 8ca78d060bbe39b51ef56053ac6efaaf054b067f..048086208a0a341e03090b114d28a16d5fed8094 100644
--- a/ecrire/inc/presentation_mini.php
+++ b/ecrire/inc/presentation_mini.php
@@ -219,7 +219,7 @@ function info_maj_spip() {
 	array_shift($maj);
 	$maj = implode('|', $maj);
 
-	return "$maj<br />";
+	return "$maj<br>";
 }
 
 /**
@@ -256,7 +256,7 @@ function info_copyright() {
 
 	// et la version de l'ecran de securite
 	$secu = defined('_ECRAN_SECURITE')
-		? '<br />' . _T('ecran_securite', ['version' => _ECRAN_SECURITE])
+		? '<br>' . _T('ecran_securite', ['version' => _ECRAN_SECURITE])
 		: '';
 
 	return _T(
diff --git a/ecrire/inc/texte.php b/ecrire/inc/texte.php
index cbe1684562fe6dff38c1bc4f984cc3be655320d2..bf4d27fd42c8ecfea2b3c7e8d8a5d26cf869c663 100644
--- a/ecrire/inc/texte.php
+++ b/ecrire/inc/texte.php
@@ -184,7 +184,7 @@ function interdire_scripts($arg, $mode_filtre = null) {
 			break;
 	}
 
-	// pas de <base href /> svp !
+	// pas de <base href> svp !
 	$t = preg_replace(',<(base\b),iS', '&lt;\1', $t);
 
 	// Reinserer les echappements des modeles
diff --git a/ecrire/install/etape_2.php b/ecrire/install/etape_2.php
index 2b82edf4ddbaee96c8985cf208b68e3c7c321356..c9c97a8bbfa49157f1357e5fb8452828d6d58c5c 100644
--- a/ecrire/install/etape_2.php
+++ b/ecrire/install/etape_2.php
@@ -113,7 +113,7 @@ function install_etape_2_bases($login_db, $server_db) {
 			$checked,
 			"<label for='choix_db'><b>"
 			. _T('texte_choix_base_2')
-			. '</b><br />'
+			. '</b><br>'
 			. _T('texte_choix_base_3')
 			. '</label>'
 			. "<ul>\n<li>"
diff --git a/ecrire/install/etape_3.php b/ecrire/install/etape_3.php
index 13232efa108f2072f15e59127c1ee07f0d4ab053..d6c8ee4e63b91048871e6f7d8844b0dbf246dbce 100644
--- a/ecrire/install/etape_3.php
+++ b/ecrire/install/etape_3.php
@@ -269,7 +269,7 @@ function install_premier_auteur($email, $login, $nom, #[\SensitiveParameter] $pa
 			_T('info_identification_publique'),
 			[
 				'nom' => [
-					'label' => '<b>' . _T('entree_signature') . "</b><br />\n" . _T('entree_nom_pseudo_1') . "\n",
+					'label' => '<b>' . _T('entree_signature') . "</b><br>\n" . _T('entree_nom_pseudo_1') . "\n",
 					'valeur' => $nom,
 					'required' => $auteur_obligatoire,
 				],
@@ -284,7 +284,7 @@ function install_premier_auteur($email, $login, $nom, #[\SensitiveParameter] $pa
 			_T('entree_identifiants_connexion'),
 			[
 				'login' => [
-					'label' => '<b>' . _T('entree_login') . "</b><br />\n" . _T(
+					'label' => '<b>' . _T('entree_login') . "</b><br>\n" . _T(
 						'info_login_trop_court_car_pluriel',
 						['nb' => _LOGIN_TROP_COURT]
 					) . "\n",
@@ -292,7 +292,7 @@ function install_premier_auteur($email, $login, $nom, #[\SensitiveParameter] $pa
 					'required' => $auteur_obligatoire,
 				],
 				'pass' => [
-					'label' => '<b>' . _T('entree_mot_passe') . "</b><br />\n" . _T(
+					'label' => '<b>' . _T('entree_mot_passe') . "</b><br>\n" . _T(
 						'info_passe_trop_court_car_pluriel',
 						['nb' => _PASS_LONGUEUR_MINI]
 					) . "\n",
@@ -300,7 +300,7 @@ function install_premier_auteur($email, $login, $nom, #[\SensitiveParameter] $pa
 					'required' => $auteur_obligatoire,
 				],
 				'pass_verif' => [
-					'label' => '<b>' . _T('info_confirmer_passe') . "</b><br />\n",
+					'label' => '<b>' . _T('info_confirmer_passe') . "</b><br>\n",
 					'valeur' => $pass,
 					'required' => $auteur_obligatoire,
 				]
diff --git a/ecrire/install/etape_ldap1.php b/ecrire/install/etape_ldap1.php
index 44a85c123c9c61859d407feb065fc9310a67744c..6dafd6fb2b1f75e41e9b701cbf03b7c948d5b0c9 100644
--- a/ecrire/install/etape_ldap1.php
+++ b/ecrire/install/etape_ldap1.php
@@ -67,7 +67,7 @@ function install_etape_ldap1_dist() {
 					'valeur' => $adresse_ldap
 				],
 				'port_ldap' => [
-					'label' => _T('entree_port_annuaire') . '<br />' . _T('texte_port_annuaire'),
+					'label' => _T('entree_port_annuaire') . '<br>' . _T('texte_port_annuaire'),
 					'valeur' => $port_ldap
 				],
 				'tls_ldap' => [
diff --git a/ecrire/install/etape_ldap2.php b/ecrire/install/etape_ldap2.php
index 45025e8590b6de70519eea6a2f21567c750c56ff..f23ccc6f7907f8b48098a43f8030ce26f5a9e813 100644
--- a/ecrire/install/etape_ldap2.php
+++ b/ecrire/install/etape_ldap2.php
@@ -99,8 +99,8 @@ function install_etape_ldap2_dist() {
 		echo info_etape(_T('titre_connexion_ldap')), info_progression_etape(1, 'etape_ldap', 'install/', true),
 			"<div class='error'><p>" . _T('avis_connexion_ldap_echec_1') . '</p>',
 			'<p>' . _T('avis_connexion_ldap_echec_2') .
-			"<br />\n" . _T('avis_connexion_ldap_echec_3') .
-			'<br /><br />' . $erreur . '<b> ?</b></p></div>';
+			"<br>\n" . _T('avis_connexion_ldap_echec_3') .
+			'<br><br>' . $erreur . '<b> ?</b></p></div>';
 	}
 
 	echo $minipage->installFinPage();
diff --git a/ecrire/install/etape_ldap3.php b/ecrire/install/etape_ldap3.php
index fa6b522c97984ade2782f03332ab528603ab3415..1d17232da3f26ae75e27f236a1f913cf2fefb687 100644
--- a/ecrire/install/etape_ldap3.php
+++ b/ecrire/install/etape_ldap3.php
@@ -68,7 +68,7 @@ function install_etape_ldap3_dist() {
 		$res .= '</ul>';
 		$res .= _T('info_ou') . ' ';
 	}
-	$res .= "<br />\n<input name=\"base_ldap\" value=\"\" type='radio' id='manuel'";
+	$res .= "<br>\n<input name=\"base_ldap\" value=\"\" type='radio' id='manuel'";
 	if (!$checked) {
 		$res .= ' checked="checked"';
 		$checked = true;
diff --git a/ecrire/install/etape_ldap4.php b/ecrire/install/etape_ldap4.php
index 05df068bce94637e3ae4f35e2ea1835300211678..32bff2d3a302edc24b7979e06f1d2b0cc84b3458 100644
--- a/ecrire/install/etape_ldap4.php
+++ b/ecrire/install/etape_ldap4.php
@@ -61,7 +61,7 @@ function install_etape_ldap4_dist() {
 				_T('info_statut_utilisateurs_1'),
 				[
 					'statut_ldap' => [
-						'label' => _T('info_statut_utilisateurs_2') . '<br />',
+						'label' => _T('info_statut_utilisateurs_2') . '<br>',
 						'valeur' => $statut_ldap,
 						'alternatives' => $statuts
 					]
@@ -78,9 +78,9 @@ function install_etape_ldap4_dist() {
 
 function liste_statuts_ldap() {
 	$recom = [
-		'info_administrateurs' => ('<b>' . _T('info_administrateur_1') . '</b> ' . _T('info_administrateur_2') . '<br />'),
-		'info_redacteurs' => ('<b>' . _T('info_redacteur_1') . '</b> ' . _T('info_redacteur_2') . '<br />'),
-		'info_visiteurs' => ('<b>' . _T('info_visiteur_1') . '</b> ' . _T('info_visiteur_2') . '<br />')
+		'info_administrateurs' => ('<b>' . _T('info_administrateur_1') . '</b> ' . _T('info_administrateur_2') . '<br>'),
+		'info_redacteurs' => ('<b>' . _T('info_redacteur_1') . '</b> ' . _T('info_redacteur_2') . '<br>'),
+		'info_visiteurs' => ('<b>' . _T('info_visiteur_1') . '</b> ' . _T('info_visiteur_2') . '<br>')
 	];
 
 	$res = [];
@@ -99,10 +99,10 @@ function install_ldap_correspondances() {
 		$nom = 'ldap_' . $champ;
 		$val = is_array($v) ? implode(',', $v) : (string) $v;
 		$champs[$nom] = [
-			'label' => _T('ldap_correspondance', ['champ' => "<tt>$champ</tt>"]) . '<br />',
+			'label' => _T('ldap_correspondance', ['champ' => "<tt>$champ</tt>"]) . '<br>',
 			'valeur' => $val
 		];
 	}
 
-	return $champs ? fieldset(_T('ldap_correspondance_1'), $champs, '', _T('ldap_correspondance_2') . '<br /><br />') : '';
+	return $champs ? fieldset(_T('ldap_correspondance_1'), $champs, '', _T('ldap_correspondance_2') . '<br><br>') : '';
 }
diff --git a/ecrire/plugins/afficher_plugin.php b/ecrire/plugins/afficher_plugin.php
index beb4be0e7c55562b05baa2813837e9745226e144..a0500fb3898c04d55cbba64973d7a1d6ee78e284 100644
--- a/ecrire/plugins/afficher_plugin.php
+++ b/ecrire/plugins/afficher_plugin.php
@@ -73,7 +73,7 @@ function plugins_afficher_plugin_dist(
 			_T('plugin_impossible_activer', ['plugin' => $nom])
 		)
 			. "<div class='erreur'>" . implode(
-				'<br />',
+				'<br>',
 				$GLOBALS['erreurs_activation_raw'][$dir_plugins . $plug_file]
 			) . '</div>';
 	} else {
@@ -169,7 +169,7 @@ function plugin_resume($info, $dir_plugins, $plug_file, $url_page) {
 	$dir = "$dir_plugins$plug_file";
 	$slogan = PtoBR(plugin_propre($info['slogan'], "$dir/lang/paquet-$prefix"));
 	// une seule ligne dans le slogan : couper si besoin
-	if (($p = strpos($slogan, '<br />')) !== false) {
+	if (($p = strpos($slogan, '<br>')) !== false) {
 		$slogan = substr($slogan, 0, $p);
 	}
 	// couper par securite
diff --git a/ecrire/public/balises.php b/ecrire/public/balises.php
index 6583d2e88a27cb73ca701ac05706854678933a80..1a426307f71ff72e8206b94e5bb0c0e3eaa3dce7 100644
--- a/ecrire/public/balises.php
+++ b/ecrire/public/balises.php
@@ -2628,7 +2628,7 @@ function balise_SLOGAN_SITE_SPIP_dist($p) {
  * @example
  *     ```
  *     [(#HTML5) required="required"]
- *     <input[ (#HTML5|?{type="email",type="text"})] ... />
+ *     <input[ (#HTML5|?{type="email",type="text"})] ...>
  *     ```
  *
  * @param Champ $p
diff --git a/ecrire/public/debusquer.php b/ecrire/public/debusquer.php
index 42ca4fc6682bd72f57e4cb102d33c5772b4b88df..0cb87f2dd9c97ea5b9166afbeca96f93363e1acc 100644
--- a/ecrire/public/debusquer.php
+++ b/ecrire/public/debusquer.php
@@ -122,7 +122,7 @@ function public_debusquer_dist($message = '', $lieu = '', $opt = []) {
 	$self = parametre_url($self, 'var_mode', 'debug');
 
 	$res = debusquer_bandeau($tableau_des_erreurs)
-		. '<br />'
+		. '<br>'
 		. debusquer_squelette($fonc, $mode, $self);
 
 	if (!_DIR_RESTREINT || headers_sent()) {
@@ -350,25 +350,25 @@ function debusquer_requete($message) {
 
 	// Erreur systeme
 	if (is_numeric($errno) && $errno > 0 && $errno < 200) {
-		$retour = '<tt><br /><br /><blink>'
+		$retour = '<tt><br><br><blink>'
 			. _T('info_erreur_systeme', ['errsys' => $errno])
-			. "</blink><br />\n<b>"
+			. "</blink><br>\n<b>"
 			. _T(
 				'info_erreur_systeme2',
 				['script' => generer_url_ecrire('base_repair')]
 			)
-			. '</b><br />';
+			. '</b><br>';
 			spip_logger()->info("Erreur systeme $errno");
 
 		return [$retour, ''];
 	}
 
 	// Requete erronee
-	$err = '<b>' . _T('avis_erreur_mysql') . " $errno</b><br /><tt>\n"
+	$err = '<b>' . _T('avis_erreur_mysql') . " $errno</b><br><tt>\n"
 		. spip_htmlspecialchars($msg)
-		. "\n<br /><span style='color: red'><b>"
+		. "\n<br><span style='color: red'><b>"
 		. spip_htmlspecialchars($query)
-		. '</b></span></tt><br />';
+		. '</b></span></tt><br>';
 
 	//. aider('erreur_mysql');
 
@@ -472,15 +472,15 @@ function ancre_texte($texte, $fautifs = [], $nocpt = false) {
 	}
 
 	$s = preg_replace(
-		',<(\w[^<>]*)>([^<]*)<br />([^<]*)</\1>,',
-		'<\1>\2</\1><br />' . "\n" . '<\1>\3</\1>',
+		',<(\w[^<>]*)>([^<]*)<br>([^<]*)</\1>,',
+		'<\1>\2</\1><br>' . "\n" . '<\1>\3</\1>',
 		$s
 	);
 
 
-	$tableau = explode('<br />', $s);
+	$tableau = explode('<br>', $s);
 
-	$format = "<span style='float:left;display:block;width:50px;height:1px'><a id='L%d' style='background-color: white; visibility: " . ($nocpt ? 'hidden' : 'visible') . ";%s' href='#T%s' title=\"%s\">%0" . (string) @strlen(count($tableau)) . "d</a></span> %s<br />\n";
+	$format = "<span style='float:left;display:block;width:50px;height:1px'><a id='L%d' style='background-color: white; visibility: " . ($nocpt ? 'hidden' : 'visible') . ";%s' href='#T%s' title=\"%s\">%0" . (string) @strlen(count($tableau)) . "d</a></span> %s<br>\n";
 
 	$format10 = str_replace('white', 'lightgrey', $format);
 	$formaterr = 'color: red;';
@@ -658,7 +658,7 @@ function emboite_texte($res, $fonc = '', $self = '') {
 		$rf = reference_boucle_debug($fermant, $fonc, $self);
 		$ro = reference_boucle_debug($ouvrant, $fonc, $self);
 		$err = $msg .
-			"<a href='#L" . $fermant . "'>$fermant</a>$rf<br />" .
+			"<a href='#L" . $fermant . "'>$fermant</a>$rf<br>" .
 			"<a href='#L" . $ouvrant . "'>$ouvrant</a>$ro";
 
 		return [ancre_texte($texte, [[$ouvrant], [$fermant]]), $err];
@@ -728,7 +728,7 @@ function debusquer_navigation_squelettes($self) {
 			. "'>"
 			. _T('zbug_calcul')
 			. '</a></legend>'
-			. ($temps ? "\n<span style='display:block;float:" . $GLOBALS['spip_lang_right'] . "'>$temps</span><br />" : (''))
+			. ($temps ? "\n<span style='display:block;float:" . $GLOBALS['spip_lang_right'] . "'>$temps</span><br>" : (''))
 			. debusquer_contexte($contexte[$sourcefile])
 		. ($nav ? "<table width='100%'>\n$nav</table>\n" : (''))
 		. "</fieldset>\n";
@@ -815,7 +815,7 @@ function debusquer_source($objet, $affiche) {
 				$brut_sql .= '<h3>' . ($num == 1 ? $num . ' sur ' . sql_count($ress_req) : $num) . '</h3>';
 				$brut_sql .= '<p>';
 				foreach ($retours_sql as $key => $val) {
-					$brut_sql .= '<strong>' . $key . '</strong> => ' . spip_htmlspecialchars(couper($val, 150)) . "<br />\n";
+					$brut_sql .= '<strong>' . $key . '</strong> => ' . spip_htmlspecialchars(couper($val, 150)) . "<br>\n";
 				}
 				$brut_sql .= '</p>';
 			}
@@ -826,7 +826,7 @@ function debusquer_source($objet, $affiche) {
 			//  ne pas afficher les $contexte_inclus
 			$view = preg_replace(',<\?php.+\?[>],Uims', '', (string) $view);
 			if ($view) {
-				$res2 .= "\n<br /><fieldset>" . interdire_scripts($view) . '</fieldset>';
+				$res2 .= "\n<br><fieldset>" . interdire_scripts($view) . '</fieldset>';
 			}
 		}
 	} elseif ($affiche == 'code') {
diff --git a/ecrire/public/evaluer_page.php b/ecrire/public/evaluer_page.php
index 43ff8617e84b50e65f43dd022dfa8e1f85cfb65a..d750689b06b1927b05f231f9a0b18f78c7734f1e 100644
--- a/ecrire/public/evaluer_page.php
+++ b/ecrire/public/evaluer_page.php
@@ -62,7 +62,7 @@ if (empty($page['process_ins']) || $page['process_ins'] != 'html') {
 		}
 		$code = '/*001*/' . preg_replace_callback(",\n,", 'numerote_ligne_php', (string) $code);
 		$code = trim(highlight_string($code, true));
-		erreur_squelette('L' . $e->getLine() . ': ' . $e->getMessage() . '<br />' . $code, [$page['source'],'',$e->getFile(),'',$GLOBALS['spip_lang']]);
+		erreur_squelette('L' . $e->getLine() . ': ' . $e->getMessage() . '<br>' . $code, [$page['source'],'',$e->getFile(),'',$GLOBALS['spip_lang']]);
 		$page['texte'] = '<!-- Erreur -->';
 	}
 	ob_end_clean();
diff --git a/ecrire/public/tracer.php b/ecrire/public/tracer.php
index 8a8845abd7900d4d92814f526ad04eb1c3385b71..caf1ade50236f2435f53e7e026e960a8a08b15ab 100644
--- a/ecrire/public/tracer.php
+++ b/ecrire/public/tracer.php
@@ -98,7 +98,7 @@ function trace_query_chrono($dt, $query, $result, $serveur = '') {
 	$tt += $dt;
 	$nb++;
 
-	$q = preg_replace('/([a-z)`])\s+([A-Z])/', "$1\n<br />$2", spip_htmlentities($query));
+	$q = preg_replace('/([a-z)`])\s+([A-Z])/', "$1\n<br>$2", spip_htmlentities($query));
 	$e = sql_explain($query, $serveur);
 	$r = str_replace('Resource id ', '', (is_object($result) ? $result::class : $result));
 	$GLOBALS['tableau_des_temps'][] = [$dt, $nb, $boucle, $q, $e, $r, $contexte];
@@ -135,7 +135,7 @@ function chrono_requete($temps) {
 		}
 		foreach ($explain as $j => $v) {
 			$explain[$j] = "<tr><th>$j</th><td>"
-				. str_replace(';', '<br />', (string) $v)
+				. str_replace(';', '<br>', (string) $v)
 				. '</td></tr>';
 		}
 		$e = "<table class='explain'>"
@@ -167,7 +167,7 @@ function chrono_requete($temps) {
 		$t[$v[2]][] = "<span class='spip-debug-arg'> "
 			. "<a title='$titre' href='$href'>$i</a>"
 			. '</span>'
-			. ((count($t[$v[2]]) % 10 == 9) ? '<br />' : '');
+			. ((count($t[$v[2]]) % 10 == 9) ? '<br>' : '');
 		$i++;
 	}
 
diff --git a/ecrire/xml/analyser_dtd.php b/ecrire/xml/analyser_dtd.php
index bb5bd4509e8a5a7b72d24ff3f495531b129b541f..a6a41ccd8f74c840f853cd35ffe8e21348c5472c 100644
--- a/ecrire/xml/analyser_dtd.php
+++ b/ecrire/xml/analyser_dtd.php
@@ -55,7 +55,7 @@ function charger_dtd($grammaire, $avail, $rotlvl) {
 			}
 
 			spip_logger()->info("Analyser DTD $avail $grammaire (" . spip_timer('dtd') . ') ' . (is_countable($dtc->macros) ? count($dtc->macros) : 0) . ' macros, ' . (is_countable($dtc->elements) ? count($dtc->elements) : 0) . ' elements, ' . (is_countable($dtc->attributs) ? count($dtc->attributs) : 0) . " listes d'attributs, " . (is_countable($dtc->entites) ? count($dtc->entites) : 0) . ' entites');
-			#	$r = $dtc->regles; ksort($r);foreach($r as $l => $v) {$t=array_keys($dtc->attributs[$l]);echo "<b>$l</b> '$v' ", count($t), " attributs: ", join (', ',$t);$t=$dtc->peres[$l];echo "<br />",count($t), " peres: ", @join (', ',$t), "<br />\n";}exit;
+			#	$r = $dtc->regles; ksort($r);foreach($r as $l => $v) {$t=array_keys($dtc->attributs[$l]);echo "<b>$l</b> '$v' ", count($t), " attributs: ", join (', ',$t);$t=$dtc->peres[$l];echo "<br>",count($t), " peres: ", @join (', ',$t), "<br>\n";}exit;
 			ecrire_fichier($file, serialize($dtc), true);
 		}
 	}