Option GLOBAL non acceptée regex

Résolu
PJ47 Messages postés 77 Date d'inscription jeudi 2 mars 2023 Statut Membre Dernière intervention 27 février 2024 - Modifié le 12 déc. 2023 à 15:45
PJ47 Messages postés 77 Date d'inscription jeudi 2 mars 2023 Statut Membre Dernière intervention 27 février 2024 - 15 déc. 2023 à 09:01

Bonjour,

je fais suite à mon sujet précédent : https://forums.commentcamarche.net/forum/affich-37954204-securite-formulaire-html-php

je suis toujours dans mon logiciel webacapella, formulaire de contact pour lequel je souhaite ne pas autoriser les URl (toutes, pas seulement la première) ainsi que tous les caractères non latins (ex : Ողջույն, ես ուզում էի իմանալ ձեր գինը ....)

grâce à @jordan45 , j'ai découvert les regex et le site : https://regex101.com/ 

merci encore ! 

mon code aujourd'hui 

      $nom = strip_tags($_POST['nom']);
      $prenom = strip_tags($_POST['prenom']);
      $email = strip_tags($_POST['mail']);

    
      $string = preg_replace('/(https?:\/\/|www\.)([a-zA-Z0-9-_\.\/\?=&]+)/g', '-',$_POST['message']);
      $regex = preg_replace('/([^!A-Za-z0-9_\ \.\:\-\éèêëîï]+)/g', 'url', $string);
      $message = $regex;

dans regex101 les expressions me permettent parfaitement de trouver et remplacer les caractères et chaines non souhaitées ---> MAIS mon logiciel à priori n'accepte pas le "g" pour global - donc je suis coincée car seule la première URL est remplacée ...

Message d'erreur suite à la validation de mon formulaire : 

Avertissement : preg_replace() : modificateur inconnu 'g' dans /home/besttermds/www/contact-best.php en ligne 21

Obsolète : preg_replace() : Passer null au paramètre n°3 ($subject) de type array|string est obsolète dans /home/besttermds/www /contact-best.php en ligne 22

Attention : preg_replace() : Modificateur inconnu 'g' dans /home/besttermds/www/contact-best.php en ligne 22

Erreur fatale : PDOException non interceptée : SQLSTATE[23000] : Violation de la contrainte d'intégrité : 1048 Colonne 'Message' ne peut pas être nul dans /home/besttermds/www/contact-best.php:27 Trace de la pile: #0 /home/besttermds/www/contact-best.php(27) : PDOStatement->execute(Array) #1 {principal} lancé /home/besttermds/www/contact-best.php en ligne 27

y'a t-il un autre moyen d'écrire ces regex sans le 'g' mais qui me permette de sonder tout le texte ??

Merci d'avance

J


Windows / Chrome 120.0.0.0

3 réponses

jordane45 Messages postés 38149 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 29 avril 2024 4 651
12 déc. 2023 à 18:24

Bonjour, 

le 'g' est implicite dans la fonction preg_replace. Tu n'as pas besoin de le mettre.


0
PJ47 Messages postés 77 Date d'inscription jeudi 2 mars 2023 Statut Membre Dernière intervention 27 février 2024 1
13 déc. 2023 à 07:05

Bonjour @jordane45 StatutModérateur

merci de ce retour, comme cela ne fonctionnait pas dans regex101, je l'avais effectivement mis - ok mes URL effectivement sont bien toutes supprimées.

en revanche

      $string = preg_replace('/(https?:\/\/|www\.)([a-zA-Z0-9-_\.\/\?=&]+)/', '-',$_POST['message']);
      $regex = htmlentities($string);
      $regex1 = preg_replace('/([^!A-Za-z0-9_\ \.\:\-\éèêëîï]+)/', 'jen', $regex);

ne fonctionne pas pour les caractères non latins (ex : Ողջույն, ես ուզում էի իմանալ ձեր գինը) cela me supprime tout.

comment enlever ces caractères sans toucher au reste du message 

merci beaucoup

0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié le 14 déc. 2023 à 16:35

Tu peux remplacer du texte écrit dans un alphabet non ASCII par une translittération en utilisant Transliterator::transliterate et iconv.

Par exemple, ton texte "Ողջույն, ես ուզում էի իմանալ ձեր գինը" (qui semble être de l'arménien) est remplacé comme ceci :

var_dump(iconv("UTF-8", "ASCII//TRANSLIT//IGNORE", transliterator_transliterate('Any-Latin; Latin-ASCII', "Ողջույն, ես ուզում էի իմանալ ձեր գինը")));

pour donner :

string(34) "Ogjuyn, es uzum ei imanal jer gin?"

(cela semble être de l'arménien selon Google Translate et cela voudrait dire : "Salut, je voulais connaître ton prix ?")

La translittération consiste à remplacer les caractères d'un jeu de caractères donné en un autre avec leur équivalent le plus proche.

Du coup, je pense que tu peux utiliser ta regexp pour supprimer les URL et faire une translittération pour n'avoir que de l'ASCII.

0
PJ47 Messages postés 77 Date d'inscription jeudi 2 mars 2023 Statut Membre Dernière intervention 27 février 2024 1
15 déc. 2023 à 09:01

Bonjour @[Dal] StatutContributeur

merci beaucoup pour cette solution !! effectivement mes caractères sont bien transformés ! merci beaucoup, je commençais à désespérer de trouver une méthode.

Merci !!

Bonne Journée

J

0