Trouver la bonne expression regulière

JRedon -  
 JRedon -

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

  1. deminion
     

    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
  2. Utilisateur anonyme
     

    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