8814 sujets

Développement web côté serveur, CMS

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
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.
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)
Modérateur
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)
Je te remercie de tes propositions de modification de technique de programmation.
Pour le reste, ce n’est pas l’objet de ma question qui est:
"Comment peut-on faire une Regex pour trouver un élément dans une chaîne de caractères qui contient des \n ?"
Merci beaucoup, je savais qu'il y avait quelque chose de ce genre à faire, mais je ne savais plus quoi.
Smiley smile