preg_match_all(), limite de taille?

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : preg_match_all(), limite de taille?

par Rei Itchido » 19 juil. 2008, 21:18

Merci pour l'info Ripat :)
Je vais donc faire autrement.

par Ripat » 18 juil. 2008, 17:32

Il y a une limite à la taille maximum du masque compilé par les PCRE:
The maximum length of a compiled pattern is 65539 (sic) bytes if PCRE
is compiled with the default internal linkage size of 2.
http://www.pcre.org/pcre.txt
Tu te heurtes sans doute à cette limite. Il faudra sans doute te tourner vers d'autres outils comme sed.

par Rei Itchido » 18 juil. 2008, 16:36

J'ai fait encore plus simple : une seule grande chaîne dans [req][/req].
$str_import = file_get_contents($_FILES['requete_fichier']['tmp_name']);  
echo $str_import; // m'affiche bien tout le contenu du fichier
preg_match_all("#\[req\](.*)\[/req\]#Us", $str_import, $ar_requete);
print_r($ar_requete); // m'affiche un tableau vide
Si je réduis la chaîne, ça passe. Si je la découpe en plusieurs, ça passe aussi.
Ca ressemble bien à un problème de mémoire.
Mais quelles sont les maxi à respecter? Je ne trouve vraiment rien dans la doc.

Un tableau a une taille maximum pour ses éléments?

EDIT : tu peux essayer, c'est tres simple : 1 fichier avec 1500 lignes avec une centaines de "a" par lignes et ce petit script de traitement

par zigz4g » 18 juil. 2008, 16:26

T'a essaye var_dump ???
Remplace ceci :
foreach($ar_requete[1] as $loop_requete) {
        echo $loop_requete."<br /><br />";
    }
Par :
var_dump($ar_requette);
Ca donne quoi ???
Apres regarde si tu recois bien tout le fichier. Pour cela tu peux soit faire un var_dump
mais ca peut etre un peu trop gros, soit tu l'ecris dans un fichier.

Edit : Que retourne preg_match_all ??? Est ce le bon nombre par rapport a ce que tu compte
avoir avec ton fichier de test ???

par Rei Itchido » 18 juil. 2008, 15:56

En fait je n'ai pas d'erreur de max_execution_time. Le script ne plante pas mais n'affiche rien dès qu'il rencontre une grande occurence.
Voilà mon code :
if (is_uploaded_file($_FILES['requete_fichier']['tmp_name'])) {
    $str_import = file_get_contents($_FILES['requete_fichier']['tmp_name']);
    preg_match_all("#\[req\](.*)\[/req\]#Us", $str_import, $ar_requete);
		
    foreach($ar_requete[1] as $loop_requete) {
        echo $loop_requete."<br /><br />";
    }
} 
Si j'ai plein de petites occurences puis une très grande, ça va m'afficher les petites puis plus rien, comme si il ne trouvait plus rien.

par zigz4g » 18 juil. 2008, 15:02

Vite fait un petit code qui m'a permis de tester ta regexp avec un total de 1000 fois les trois blocs.
<?php
$texte = '';
for ($i = 1000; $i > 0; $i--) {
	$texte .= '[req]';
	for ($j = 30; $j > 0; $j--) {
		$texte .= 'qwertyuiop';
	}
	$texte .= '[/req]';
}
if (($nb = preg_match_all('#(\[req\])(.*)(\[/req\])#Us', $texte, $tabResult)) == false) {
	echo 'Erreur avec la regexp.<br/>';
}
else {
	echo 'Il y a ' . $nb . ' occurences.<br/>';
	echo '<pre>'; var_dump($tabResult); echo '</pre>';
}
?>
Si j'ai bien compris ce que tu as dans ton texte, en changeant le $i et le $j a 10000 et 300, j'obtiens un resultat correct.
J'ai pour info un max_execution_time = 60.

preg_match_all(), limite de taille?

par Rei Itchido » 18 juil. 2008, 11:31

Bonjour à tous,

Je ne trouve rien dans la doc donc je fais appel à votre experience :)

J'ai besoin de récuperer dans un fichier texte, les chaines contenus entre 2 balises [req] et [/req].
Je me rend compte que si une occurence est trop longue, je traitement se stoppe carrément.

Voici mon pattern

Code : Tout sélectionner

#(\[req\])(.*)(\[/req\])#Us
Imaginons que j'ai

Code : Tout sélectionner

[req]aaa[/req] [req]bbb[/req]
Je récupère bien aaa et bbb

Mais si j'ai une occurence de plusieurs centaines de lignes, le script s'arrête et ne me retourne rien.
Si je coupe cette longue occurence par des [/req][req], cela fonctionne, donc le problème vient bien de la longueur de la chaîne.

Je ne trouve pas, dans la doc, de référence à une taille maxi ou quoi que ce soit.

Est-ce preg_match_all() qui a une taille limite de traitement ou est-ce plutôt le tableau retourné qui ne peut gérer de trop longues chaînes?