2009-09-01 6 views
1

Un couple de questions PHP ereg_replace. J'ai un tableau de noms:PHP ereg_replace questions

$ssKeywords = array("Str", "Int", "String", "As", "Integer", "Variant"); 

Cependant quand j'utiliser cette ereg_replace:

foreach($arKeyword as $aWord) { 
    $sCode = ereg_replace($aWord, "<span class='ssKeyword'>".$aWord."</span>", $sCode); 
} 

Il ne trouvera que la "str" ​​ou "int" pas le match plein. Apparemment, ereg_replace est gourmand, alors pourquoi ne cherche-t-il pas le match complet?

J'ai réussi à obtenir des commentaires en utilisant preg_replace.

Répondre

3

Avez-vous besoin d'utiliser ereg? il a été déprécié et sera obsolète à partir de PHP 6. Je vous suggère d'utiliser preg, qui est aussi plus efficace.

Cette information est disponible à php.net/ereg

+0

L'utilisation de cette fonction provoque seulement des erreurs. –

+0

Le sens de l'existence des erreurs doit être fixé, ne pas être oublié en utilisant une fonction différente;) – bezmax

+0

Eh bien, j'ai des commentaires qui fonctionnent! Maintenant, juste les mots-clés. –

3

Au lieu de chercher un terme à la fois mieux chercher tous à un moment:

$sCode = preg_replace('/(?:'.implode('|', array_map('preg_quote', $ssKeywords)).')/', '<span class="ssKeyword">$0</span>', $sCode); 

Et si vous triez les termes par sa longueur, vous trouverez entier au lieu de simplement Int:

usort($ssKeywords, create_function('$a,$b', 'return strlen($b)-strlen($a);')); 
+0

Eh bien, la partie de tri a fonctionné, mais le remplacement réel n'a pas fonctionné. –

+0

Ah, bonjour, j'avais toujours le code dans la boucle foreach. –

3

Votre problème n'a rien à voir avec ereg_replace. Preg_replace n'est pas seulement un meilleur pari, mais en fait, dans votre cas, vous n'utilisez aucun type d'expressions régulières; vous faites juste un match de corde simple. Donc str_replace serait plus rapide et plus clair.

Le problème est que vous faites:

foreach($arKeyword as $aWord) { 

qui boucle du premier au dernier élément du tableau, tester toute la chaîne contre chacun des mots-clés dans l'ordre que vous déclaré. Vous avez déclaré 'Int' en premier, donc tout 'Integer' dans la chaîne sera remplacé par "< span class =" ssKeyword "> Int </span> eger" avant que la boucle ne soit aussi loin que le mot clé 'Entier'. À ce moment, avec le "</span>" dans le chemin, il ne correspondra jamais.

Modifiez l'ordre du tableau afin que les mots clés les plus longs soient les premiers et fonctionnent.

+0

C'est une bonne idée. Dommage que je puisse obtenir cela fonctionne bien dans JavaScript cependant. Merci quand même! –

+0

Qu'en est-il de l'insensibilité à la casse? –

+0

str_ireplace, éventuellement. Bien que si vous devez insensible à la casse mais préserver, oui, preg_replace pourrait être le chemin le plus facile. – bobince

0

Si vous faites une correspondance en texte brut, alors str_replace est plus efficace et moins inutile. Si vous avez besoin d'expressions régulières à tout moment dans le futur, utilisez les fonctions preg_* car ereg_* est obsolète et preg_* est plus rapide.

En ce qui concerne votre question sur "gourmand", cela se réfère à quand vous utilisez réellement des expressions régulières. Par exemple, si vous avez le texte:

Hello World! Hello World! 

Et utilisez une expression régulière comme ceci:

/Hell(.+)rld!/ 

Ensuite, il correspondra à la chaîne entière, car l'opérateur + est avide et trouve autant que possible sur une ligne.Vous devez le faire pour l'empêcher d'être gourmand et faire correspondre chacune des phrases:

/Hell(.+?)rld!/