Trouver la bonne expression regulière

JRedon - 19 févr. 2024 à 08:35
 JRedon - 23 févr. 2024 à 09:53

Bonjour, Je n'arrive pas à me dépatouiller d'un cas bien précis que voila:
 
 j'ai des chaines de caractères du genre ci dessous 
$ligne="Kyriak Kostandi(%Lilacs (1902) % % % %"
$ligne="Harold Harvey(%A Kitchen Interior%1918 % % %"
je voudrais obtenir dans $ligne:
Kyriak Kostandi()Lilacs 1902
Harold Harvey()Kitchen Interior 1918  
en utilisant les expressions régulières, j'ai écrit:
$ligne=preg_replace('#(\w+)(%\()(\w+ ?)( ?[\(|%][0-9]{4})(.*)#',"$1()$3 $4",$ligne) ;
et j'obtiens
Kyriak Kostandi()
Harold Harvey()       

si un pro du php pouvait m'expliquer où est l'erreur, il aurait toute ma reconnaissance. D'avance milles merci

Jacques

3 réponses

Bonjour.

Pourquoi ne pas faire plusieurs expressions simples plutôt qu'une seule indigeste ?

Surtout que les deux chaînes sont de différents formats, donc difficile dans une seule regex.

Quelque chose comme :

$ligne = "Harold Harvey(%A Kitchen Interior%1918 % % %";
$ligne = preg_replace('#\(%(\w )?#', '()', $ligne);
$ligne = preg_replace('#( %)*$#', '', $ligne);
$ligne = preg_replace('#\((\d{4})\)#', '$1', $ligne);
$ligne = str_replace('%', ' ', $ligne);
echo "'$ligne'";

Qu'on mettrait dans une fonction.

0
Utilisateur anonyme
19 févr. 2024 à 13:05

Bonjour

si tes lignes ont toutes le format que tu as montré

^([\w ]+?)[(%) ]*([\w ]+?)[(%) ]*(\d+)[(%) ]*$

A remplacer par

$1() $2 $3

Que tu peux testé là https://regex101.com/r/LnJEog/1


0

merci, probleme resolu

0