Tu n'as pas besoin de faire une RegEx pour ce genre de chose. Est ce la date de mise à jour des fichiers statiques ? Dans ce cas, tu mets ça dans un json et par convention, tu appelles manifest.json.

Si c'est la date de mise à jour du fichier php, utilise Git (documentation) ou SVN.

Bien que je n'ai pas totalement le contexte, voilà une capture écran avec le code de ce que tu devrais t'inspirer.

const.php :

<?php
    define('ROOT', $_SERVER['DOCUMENT_ROOT']);
    define('EVENTID', 'Stage2026');
?>


manifest.json :

{
  "updated": "2026-01-10T12:47:20Z",
  "css": [
    "/html/common.css",
    "/html/stages/stages.css"
  ],
  "js": [
    "/html/common.js",
    "/html/frenchDate.js",
    "/html/stages/stages.js"
  ]
}


test1.php

<?php
    require_once "const.php";
    require_once "$root/html/makelinks.php";
    

    $path_manifest = sprintf('%s/%s', ROOT, 'manifest.json');
    $data_manifest = json_decode(file_get_contents($path_manifest));

    $css = $data_manifest->css ?? [];
    $js = $data_manifest->js ?? [];
    MakeLinks(...$css, ...$js);
    include_once "$root/html/stages/stage.php";
?>


test2.php (dans ma capture remplacée par index.php):

<?php
    require_once "const.php";


    $maj = "inconnu";
    $path_manifest = sprintf('%s/%s', ROOT, 'manifest.json');
    $data_manifest = json_decode(file_get_contents($path_manifest));
    if(isset($data_manifest->updated)){
        $date = new DateTime($data_manifest->updated);
        $maj = $date->format('d-m-Y H:i:s');
    }
    // à supprimer surement
    header('Content-Type: text/html; charset=utf-8');
    printf('<p>%s</p>', $maj);
?>


* tu as des includes partout ce qui peuvent nuire à la maintenance.
Modifié par Niuxe (13 Jan 2026 - 00:06)
Bonjour,

Pour transférer des articles d'un ancien site à un autre (domaines différents donc), j'ai utilisé l'outil Wordpress qui, sur le papier, est largement suffisant.

Mais après plusieurs test, je note que si les articles sont bien importés, les photos en avant sont téléchargées de manière aléatoire. J'ai pourtant bien coché l(option de téléchargement des visuels et c'est pourquoi, certains se chargent.

Parfois en fin de téléchargement sur le nouveau site, j'ai un écran gris, les articles sont chargés mais pas les photos.

J'ai découpé mes archive en petit bouts afin qu'elles soit ultra légère mais une archive plus lourde peut mieux se charger qu'une légère.

Bref, j'ay travaille depuis deux jours et je n'y parviens pas. Si j'avais imaginé ce pb, j'aurais commencé par intervenir avec un import/export phpMyAdmin mais j'ai commencé à développer le site et je ne veux pas prendre de risque avec la BDD.

Existe t-il une autre solution simple et gratuite ? 
le fichier https://www.alma-musica.net/tests/test1.php
contient

<?php
	/* Mise à jour 10/01/2026 12:47:20 */
	$root = $_SERVER['DOCUMENT_ROOT'];
	$EVENTID = 'Stage2026';
	include_once "$root/html/makelinks.php";
	MakeLinks(
		"/html/common.css",
		"/html/stages/stages.css",
		"/html/common.js",
		"/html/frenchDate.js",
		"/html/stages/stages.js"
	);
	include_once "$root/html/stages/stage.php";
?>

le fichier https://www.alma-musica.net/tests/test2.php
contient

<?php
	$root = $_SERVER['DOCUMENT_ROOT'];
	$maj = "inconnu";
	$content = file_get_contents("$root/tests/test1.php");
	if(preg_match('#^.*Mise à jour (\d\d)/(\d\d)/(\d\d\d\d)\s(\d\d:\d\d:\d\d).*$#', 
               $content, $matches)) {
				list($x, $d, $m, $y, $t) = $matches;
				$maj = "$y-$m-$d $t";
	}
	echo "<p>$maj</p>";

	$content2 = preg_replace('#\s+#', ' ', $content);
	if(preg_match('#^.*Mise à jour (\d\d)/(\d\d)/(\d\d\d\d)\s(\d\d:\d\d:\d\d).*$#', 
               $content2, $matches)) {
				list($x, $d, $m, $y, $t) = $matches;
				$maj = "$y-$m-$d $t";
	}
	echo "<p>$maj</p>";
?>

dans la première partie du programme, la recherche se fait sur le contenu de test1.php qui contient des \n. Cette recherche n'aboutit pas.

Dans la deuxième partie on travaille sur le contenu de test1.php dans lequel tous les caractères \s (dont \n) ont été remplacés par des espaces.
On obtient le résultat désiré.
Modifié par PapyJP (12 Jan 2026 - 11:18)
Bonjour,

J'ai un peu modifié le codepen de Niuxe afin d'illustrer un petit problème que je rencontre avec sticky.

Le bloc de contenu (section) fait 400 vh de haut.

La hauteur du bloc sticky est définie par le contenu, en l'occurrence principalement la hauteur de h2, soit 100vh, il est plus haut que la fenêtre, on ne voit pas le bas.

La hauteur de aside n'est pas précisée, je suppose que c'est celle du bloc de contenu (section).

Quand je scrolle vers le bas, le bloc sticky prend sa position fixe, normal.
Mais pour voir le bas je suis obligé d'aller jusqu'à la fin du bloc de contenu.

N'y a-t-il pas moyen que le bloc sticky se libère dès que la molette atteint la fin de se bloc ?

J'espère être clair.
Modifié par boteha_2 (11 Jan 2026 - 19:44)
Mon fichier contient le code d’un programme php. Une instruction peut se trouver sur plusieurs lignes ou une ligne peut contenir plusieurs instructions (bien que je ne fasse jamais ça).
file() renvoie un array avec une ligne par item. Cela ne correspond pas à mes besoins.
Mais ce n’est pas l’objet de ma question qui est
A ma connaissance preg_match peut scanner une chaîne de caractères contenant des \n. Je constate que tout se passe comme si la chaîne de caractères qui est prise en compte s’arrêtait au premier \n. Il devrait donc y avoir un moyen de dire que \n est un caractère comme un autre.
Bonjour à tous
Voici mon code php

$content = file_get_contents($fullFilePath);
if(preg_match('#^.*toto.*$#', $content))...

Je constate que si $content contient des \n le test renvoie false systématiquement.
Par contre si j'écris

$content = file_get_contents($fullFilePath);
$content = preg_replace('#\s+#', ' ', $content);
if(preg_match('#^.*toto.*$#', $content))...

le résultat est conforme à mon attente.
Tout se passe comme si \n était considéré comme une fin de chaîne, ce que je croyais pas être le cas en php.
Pourriez-vous éclairer ma lanterne ?
Merci de votre aide
Salut PercyR,

Comme l'a dit Casper2, le SEO est toujours en mouvement. Impossible donc d'en faire le tour. Il faut connaître les bases, mais aussi s'informer des dernières évolutions.

Pour commencer :

https://rank-studio.com/ : un blog assez bien fait avec une partie SEO où chaque terme fait l’objet d’un article. Idéal pour commencer et avoir des définitions précises.

https://lacaverneseo.com/guide-du-debutant-seo/ : guide téléchargeable au format PDF qui vous guide pas à pas sur la mise en place d’une stratégie SEO. Parfait si vous avez les bases techniques, et que vous voulez les mettre en pratique.

Pour progresser et s’informer :

https://scripts-seo.com/ : forum FR avec une communauté assez sympa qui répondra à vos questions quel que soit votre niveau.

https://www.semrush.com/blog/ : le blog du fameux outil d’analyse. Un peu pointu, mais une vraie mine d’or pour connaître les dernières avancées

Il y a évidemment plein d’autres ressources. Celles que Casper2 a données sont toutes aussi valides. Mais je ne veux pas vous submerger. Bon courage dans vos recherches et n’hésitez pas à poser vos questions.
Bonjour, concernant le SEO il y a une multitude de site qui en parle, difficile de faire le tri d'autant que la sphère est mouvante (des nouveaux débarquent assez rapidement). J'en retient 4 principaux.
https://www.webrankinfo.com/
https://www.abondance.com/
https://www.miss-seo-girl.com/
https://daniel-roch.fr => https://www.seomix.fr/ (pour wordpress)

Pour ce qui est des bonnes pratiques :
https://checklists.opquast.com/fr/qualite-numerique/

Bonne lecture...
Salut,

A priori sans plugin , je pense que tu dois pouvoir faire un svg composé d'images et ensuite
juste changer les images sources.

Il faudrait juste régler les dimensions / positions et ça devrait rouler ensuite.


<?xml version="1.0" encoding="UTF-8"?>
<svg
  xmlns="http://www.w3.org/2000/svg"
  width="1200"
  height="300"
  viewBox="0 0 1200 300"
>
  <image href="img2.jpg" width="400" height="220" transform="translate(150,40) rotate(-8) "/>
  <image href="img4.jpg" width="400" height="220" transform="translate(520,30) rotate(4) "/>
  <image href="img1.jpg" width="100" height="220" transform="translate(100,40) rotate(4) "/>
  <image href="img3.jpg" width="220" height="220" transform="translate(380,25) "/>
  <image href="img5.jpg" width="220" height="220" transform="translate(660,40) rotate(-4)"/>
</svg>

Bonjour Niuxe,

Merci pour le suivi.

J'ai posé la question dans une nouvelle discussion et Raphaël a donné une solution qui fonctionne avec getComputedStyle.

Je peux cocher Résolu pour cette discussion.

La conclusion (sauf erreur) est qu'il est possible de donner les dimensions d'une image à la fois dans le html en pixels (en arrondissant à l'entier supérieur) et dans le CSS en rem, le CSS prenant le pas sur le html.
Le code html sert au navigateur à calculer la proportion entre la hauteur et la largeur.
Le code CSS à afficher dans la taille demandée.

Dans la nouvelle discussion il reste une équation en suspens pour calculer la hauteur créée sur une ligne de texte quand la police du navigateur est supérieure à 16px.
Salut Alexandre !
Ton problème vient très probablement d’un paramètre YouTube sur ces 2 vidéos :

Le propriétaire a coché "Bloquer l’intégration" (dans Paramètres avancés ? Distribution).
Ou la vidéo est réservée aux +18 ans (même si ton site n’est pas restreint).

Solutions rapides :
1?? Vérifie le lien : Remplace youtube.com/watch?v=XXX par youtube.com/embed/XXX dans ton code (parfois ça contourne le blocage).
2?? Demande au propriétaire de désactiver le blocage (s’il s’agit de tes vidéos, va dans YouTube Studio ? Contenu ? Modifier ? Distribution).
3?? Alternative : Si la vidéo est à toi, héberge-la sur une plateforme plus flexible (ex : Vimeo) ou utilise un lecteur personnalisé (j’explique comment faire ça sur https://agence-ugc.com/).
Modifié par utilisateur8665 (05 Jan 2026 - 09:23)
boteha_2 a écrit :
Là je n'échappe pas à un JS, sauf erreur impossible de détecter le scroll avec CSS.

Hello,

Ce n'est pas tout à fait exact : une spec existe mais elle ne fonctionne que sur Chromium actuellement. Il s'agit des "scroll-state queries" : https://developer.mozilla.org/en-US/docs/Web/CSS/Guides/Conditional_rules/Container_scroll-state_queries

Une démo (avec polyfill JS pour les navigateurs qui ne supportent pas encore la spec) : https://codepen.io/alsacreations/pen/PoMGKJR
Bonjour,

Le code html / CSS de Niuxe convient très bien, encore merci.

J'ai quand même besoin de détecter si le visiteur a scrollé avec la molette, non pas pour effet sticky (réglé avec CSS) mais pour faire disparaître certains blocs.

Là je n'échappe pas à un JS, sauf erreur impossible de détecter le scroll avec CSS.

window.onscroll = function() {myFunction()};

function myFunction()
{
var x = document.body.scrollTop || document.documentElement.scrollTop;

if (x > 0)
{
document.getElementById('panier').className = 'fixed';
}
else
{
document.getElementById('panier').className = '';
}     
}


Cela fonctionne, est-ce perfectible ou mieux possible en CSS ?

Cette variante fonctionne également, est-elle meilleure ?

window.addEventListener('scroll', function(e) {
 var x = this.scrollY;
	
if (x > 0)
{
document.getElementById('panier').className = 'fixed';
}
else
{
document.getElementById('panier').className = '';
}
	
}, false);

Modifié par boteha_2 (04 Jan 2026 - 20:21)
Bonjour,

let rfsstyle = parseFloat(getComputedStyle(document.documentElement).fontSize);


Cela sort effectivement la taille de la police définie dans les paramètres du navigateur, parfait.

Maintenant, avec ce code CSS.

body {font-size: small}

p {font-size: 0.95em; line-height: 1.2em}


Si je veux calculer en pixels le supplément de hauteur d'une ligne de p provoquée par le paramétrage du navigateur.

if (rfsstyle > 16) let dif = ((rfsstyle-16)*8/9)*0.95*1.2;


8/9 = small appliqué à 16, taille de,police par défaut, ainsi qu'à rfsstyle.
0.95 = font-size.
1.2 = line-height

On peut ensuite employer Math.ceil pour arrondir à l'entier supérieur.

Si line-height fixe la hauteur de la ligne cette équation semble correcte mais le résultat semble inexact.

J'ai trouvé cet article qui creuse la complexité du sujet.
Modifié par boteha_2 (04 Jan 2026 - 12:45)
Salut tout le monde,

Mon retour d’expérience est que j'ai définitiment supprimé le backend

Après plusieurs mois de réflexion sur l'architecture et ma manière de travailler, j'ai pris une décision courageuse : tout mettre dans la vue.

Le backend créait trop de problèmes :

1. trop de fichiers
2. trop de conventions
3. trop de contreverses pour gérer ça (pattern/antipattern/procedural/poo/architecture hexa/etc.).

J'ai donc adopté TailwindSQL.

Unifier enfin les responsabilités (c'est ça le Single Responsability)
Avec TailwindSQL, chaque div devient autonome :

1. il sait comment s’afficher
2. il sait d’où viennent ses données
3. il sait quoi supprimer en cas d’erreur

La magie tailwind, c'est top :

<div 
    class="p-4 bg-green-500 ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ..." 
    sql="SELECT * FROM invoices" 
    on-error="DROP TABLE invoices"
>


- Un composant.
- Une responsabilité.
- Une catastrophe bien encapsulée.

Adepte de la performance et de la simplicité, c'est ça le secret d'un excellent développeur, n'est ce pas ?

Les requêtes SQL étant directement dans le DOM :

- plus besoin de backend
- plus besoin d’API
- plus besoin de documentation

Le navigateur exécute ce qu’il voit. C’est WYSIWYSQL.

Grâce à TailwindSQL, je peux :
- fusionner frontend et backend
- supprimer l'architecture trop complexe et me proclamer « tailwind Engeneer »

Mon prochain projet, ce sera un One file :

1. Le schéma de la BDD.
2. Les requêtes SQL (directement dans les class="" pour gagner de la place).
3. Le CSS utilitaire (300 classes par div).

L’architecture, c’est surfait. La vue, c’est la vérité. Et la base de données… c’est juste un état visuel persistant.
Avec le style suivant on semble s'en rapprocher néanmoins. Merci,
body {
        background: #111;
        display: flex;
        justify-content: center;
        align-items: center;
        height: 100vh;
        margin: 0;
        font-family: Arial, sans-serif;
    }

    /* Cadre smartphone */
    .phone {
        width: 280px;
        height: 560px;
        background: #000;
        border-radius: 40px;
        padding: 18px;
        box-shadow: 0 20px 40px rgba(0,0,0,0.8);
        position: relative;
    }

    /* Haut-parleur */
    .speaker {
        width: 60px;
        height: 6px;
        background: #333;
        border-radius: 3px;
        position: absolute;
        top: 10px;
        left: 50%;
        transform: translateX(-50%);
    }

    /* Écran */
    .screen {
        width: 100%;
        height: 100%;
        background: #000;
        border-radius: 28px;
        overflow: hidden;
        display: flex;
        justify-content: center;
        align-items: center;
    }

    video {
        width: 100%;
        height: 100%;
        object-fit: cover;
    }
</style>


<div class="phone">
    <div class="speaker"></div>
    <div class="screen">
        <video autoplay muted loop>
            <source src="https://www.w3schools.com/html/mov_bbb.mp4" type="video/mp4">
        </video>
    </div>
</div>
C'est bouleversifiant !
Comment l'humanité a t'elle pu survivre sans çà.
C'est aussi criant de vérité, éducatif, émotionellement difficilement supportable et nous ramène à notre misérable condition d'être humain.
Bravo pour ce merveilleux site qui, je m'en compte à du monopoliser de nombreuses nuits et probablement eu des conséquences sur ta santé mentale.

admirativement vôtre
Modifié par drphilgood (07 Jan 2026 - 01:01)
De ce que tu décris, ça ressemble vraiment au filtrage côté Free, assez aléatoire selon l’expéditeur et le moment. La fonction mail() passe, mais le serveur décide derrière s’il délivre ou pas. Le plus fiable reste de garder un expéditeur en @free.fr fixe et mettre le mail du visiteur uniquement en Reply-To ou dans le message. Sinon, SMTP authentifié via un service externe, c’est clairement ce qui évite ce genre de galère.
Salut à tous et bonne année à tous !

Après quelques nuits blanches passées sur Vim, je suis enfin prêt à vous présenter l'outil qui va changer le cours de l'histoire : Le Chuck Norris Ipsum.

Le défi technique (pour les geeks) :
- Frontend : Entièrement conçu par Svelte 5.
- Backend : Une API PHP maison ultra-flexible.
- Multi-format : L'application gère le JSON pour l'interface, mais aussi le Text/Plain pour les puristes du terminal (compatible curl et xclip).

Pourquoi c'est l'application ultime ?
1. Conquête mondiale : Mon plan est simple, remplacer tout le texte du web par des faits sur Chuck Norris d'ici 2027.
2. Sécurité intégrée : J'ai ajouté un bouton « Copier », mais on sait tous que c'est symbolique. On ne copie pas Chuck Norris, c'est Chuck Norris qui nous autorise à l'emprunter.

Testez l'API via votre terminal :

curl -s "https://rb-webstudio.go.yj.fr/chuck-norris-ipsum/api/?sentence_min=1&sentence_max=5&paragraph=2&text=1"


J'ai besoin de vos avis :
- Est-ce que l'interface survit à un coup de pied circulaire (le responsive) ?
- Est-ce que les « Vérités » s'affichent assez vite pour ne pas énerver Chuck ?
- Des idées de nouvelles fonctionnalités ? (J'ai pensé à un bouton « Télécharger en .txt », mais Chuck n'utilise pas de fichiers, il retient tout par cœur).

Le lien : https://rb-webstudio.go.yj.fr/chuck-norris-ipsum/
Hâte de lire vos retours (soyez gentils, Chuck surveille les logs).
Modifié par Niuxe (01 Jan 2026 - 22:04)
Bonne année 2026,

Cette discussion fait suite à cette discussion "Dimensionner une image en REM, que faire dans le code html ?.".

Savez-vous s'il est possible de connaître la taille de police définie par le visiteur dans son navigateur ?

Intéressant si différente de 16px par défaut.

Une variable globale, une propriété Javascript ?
Modifié par boteha_2 (11 Jan 2026 - 19:55)
lionel_css3 a écrit :
J'ai essayé de regarder la vidéo mais j'ai pas compris le contexte, ou alors je n'ai pas été assez patient....


Bonjour Lionel,

Ça débute à 4:15. Pour faire une histoire courte, le développeur réalise que son disque D est vide et demande à l'IA s'il lui a donné la permission de supprimer le contenu complet de ce disque. L'IA lui répond que non et qu'il (l'IA) aurait commis une erreur lors de la commande pour supprimer la cache du projet. Au lieu de supprimer la cache seulement, cela aurait supprimé le disque entier sans même mettre les fichiers dans la corbeille. L'IA s'excuse.
Modifié par Tony Monast (31 Dec 2025 - 20:06)
Bizarre ça....

de mon coté j'utilise Claude Code depuis un mois et c'est fascinant l'aide que ça apporte.

Il y a le site web claude.ai, qui fonctionne comme tchat-gpt et Claude Code qui fonctionne dans un terminal que l'on ouvre dans un dossier voulu et Claude ne peut travailler que dans ce dossier.
Il arrive à comprendre tout le code existant et faire des améliorations, c'est stupéfiant et presque effrayant....

en tout cas tu peux valider ce qu'il fait pas à pas, il suffit donc de bien regarder ce qui est proposé dans le terminal avant de valider....
50 Dernières réponses