2013-02-15 6 views
0

Je sais it is not recommended to parse XML/HTML with a reg-ex, mais je suis en train de faire cette chose simple:preg_replace retourne une chaîne vide lorsque vous utilisez beaucoup d'espaces

<?php 
echo phpversion()."<br><br>"; 

$test_1 = '<Tag attr="attr_value">Tag_value</Tag>'; 
$test_2 = $test_1.str_repeat(' ',1000); 
$test_3 = $test_1.str_repeat(' ',2000); 

$match = '!<(.*?) (.*?)="(.*?)">!'; 
$replace = '<\\2>\\3</\\2><\\1>'; 

$output_1 = preg_replace($match, $replace, $test_1); 
$output_2 = preg_replace($match, $replace, $test_2); 
$output_3 = preg_replace($match, $replace, $test_3); 

echo "xml: ".htmlspecialchars($test_1)."<br>"; 
echo "1: ".htmlspecialchars($output_1)."<br>"; 
echo "2: ".htmlspecialchars($output_2)."<br>"; 
echo "3: ".htmlspecialchars($output_3)."<br>"; 
?> 

Je veux dire, mettre un attribut et sa valeur de la balise conteneur. Tout fonctionne correctement avec les exemples test_1 et test_2, mais si j'ajoute plus d'espaces comme dans test_3, la chaîne de retour est vide. Quelqu'un peut-il essayer ce code?

Dans cet exemple, il fonctionne en ajoutant 1411 espaces. Un de plus (1412) et pas ...

J'ai testé sur les versions 5.3.8 et 5.3.19 PHP.

Merci.

+0

Je ne connais pas la raison, mais vous pouvez toujours couper la chaîne en premier. – vedarthk

Répondre

0

fonctionne bien pour moi sur PHP 4.4.8 de la ligne de commande. Votre expression semble être très inefficace. Probablement cela provoque une sorte d'erreur, par ex. Mémoire insuffisante, et donc preg_replace renvoie NULL ce qui signifie "erreur". Voici la version optimisée de votre expression:

<(\S*?) (\S*?)="([^"]*?)"> 
+0

Fonctionne si je remplace $ par: $ replace = '<\\2> \\ 3 \\ 1'; Merci – ilvi

+0

Enfin, je choisis cette solution, elle fonctionne avec de grandes chaînes contenant beaucoup de tags/attributs. Merci encore. – ilvi

1

Utilisez cette regex et il fonctionne correctement:

$match = '!<([^ ]+) ([^=]+)="(.*?)">!'; 
+0

Merci beaucoup. – ilvi

+0

Aussi, il est 300x plus rapide que mon match d'origine, mesuré avec microtime et une boucle. Agréable. Même 10%/15% plus rapide que la solution Mikhails. – ilvi

Questions connexes