Question

Je vais avoir un problème de mémoire tout en testant une trouvaille / remplacer la fonction.

Dites le sujet de recherche est:

$subject = "

I wrote an article in the A+ magazine. It'\s very long and full of words. I want to replace every A+ instance in this text by a link to a page dedicated to A+.

";

la chaîne à trouver:

$find='A+';
$find = preg_quote($find,'/');

la fonction de rappel de fonction remplacer:

 function replaceCallback($match)
    {
      if (is_array($match)) {
          return '<a class="tag" rel="tag-definition" title="Click to know more about ' .stripslashes($match[0]) . '" href="?tag=' . $match[0]. '">' . stripslashes($match[0])  . '</a>';
      }
    }

et l'appel:

$result = preg_replace_callback($find, 'replaceCallback', $subject);

, le modèle recherché complet est tiré de la base de données. A partir de maintenant, il est:

$find = '/(?![^<]+>)\b(voice recognition|test project reference|test|synesthesia|Superflux 2007|Suhjung Hur|scripts|Salvino a. Salvaggio|Professional Lighting Design Magazine|PLDChina|Nicolas Schöffer|Naziha Mestaoui|Nabi Art Center|Markos Novak|Mapping|Manuel Abendroth|liquid architecture|LAb[au] laboratory for Architecture and Urbanism|l'Arca Edizioni|l' ARCA n° 176 _ December 2002|Jérôme Decock|imagineering|hypertext|hypermedia|Game of Life|galerie Roger Tator|eversion|El Lissitzky|Bernhard Tschumi|Alexandre Plennevaux|A+)\b/s';

Ce modèle de $ find est alors cherché (et remplacé en cas) dans 23 colonnes sur 7 tables MySQL.

Utilisation du preg_replace suggéré () au lieu de preg_replace_callback () semble avoir résolu le problème de mémoire, mais je vais avoir de nouveaux problèmes sur le chemin: le sujet retourné par preg_replace () manque beaucoup de contenu ...

Mise à jour:

la perte de contenu est due à l'utilisation preg_quote ($ find, '/'); Il travaille maintenant, sauf ... « A + » qui devient « A » après le processus.

Était-ce utile?

La solution

Bon - je peux voir, maintenant, pourquoi vous utilisez la fonction de rappel

Tout d'abord, je voudrais changer votre rappel à cette

function replaceCallback( $match )
{
    if ( is_array( $match ) )
    {
        $htmlVersion    = htmlspecialchars( $match[1], ENT_COMPAT, 'UTF-8' );
        $urlVersion     = urlencode( $match[1] );
        return '<a class="tag" rel="tag-definition" title="Click to know more about ' . $htmlVersion . '" href="?tag=' . $urlVersion. '">' . $htmlVersion  . '</a>';
    }
    return $match;
}

Les commandes de stripslashes ne vont pas vous faire du bien.

En ce qui concerne aborder la question de la mémoire, vous pouvez diviser votre modèle en plusieurs modèles et les exécuter dans une boucle. Je pense que votre match est tout simplement trop grand / complexe pour PHP gérer en un seul cycle d'appel.

Autres conseils

Je suis en train de reproduire votre erreur, mais il y a une erreur d'analyse qui doit être fixé en premier. Soit ce n'est pas assez de code pour être un bon échantillon ou il y a vraiment un bug.

Tout d'abord, la valeur que vous stockez dans $ find est pas un modèle de traction - donc je devais ajouter délimiteurs motif

.

En second lieu, votre chaîne de remplacement ne comprend pas l'élément de fermeture pour les balises d'ancrage.

$subject = "
I wrote an article in the A+ magazine. It'\s very long and full of words. I want to replace every A+ instance in this text by a link to a page dedicated to A+.
";

$find='A+';
$find = preg_quote($find,'/');

function replaceCallback($match)
{
  if (is_array($match)) {
      return '<a class="tag" rel="tag-definition" title="Click to know more about ' .stripslashes($match[0]) . '" href="?tag=' . $match[0]. '">' . stripslashes($match[0])  . '</a>';
  }
}

$result = preg_replace_callback( "/$find/", 'replaceCallback', $subject);

echo $result;

Ce code fonctionne, mais je ne suis pas sûr que c'est ce que vous voulez. En outre, j'existe de fortes présomptions que vous n'avez pas besoin preg_replace_callback () du tout.

Cela fonctionne ici pour moi, je devais changer le match preg un peu, mais il transforme chaque A + pour moi en lien. Vous êtes également un manque </a> à la fin.

$subject = "I wrote an article in the A+ magazine. It'\s very long and full of words. I want to replace every A+ instance in this text by a link to a page dedicated to A+.";

function replaceCallback($match)
{
    if (is_array($match)) 
    {
        return '<a class="tag" rel="tag-definition" title="Click to know more about ' .stripslashes($match[0]) . '" href="?tag=' . $match[0]. '">' . stripslashes($match[0])  . '</a>';
    }
}

$result = preg_replace_callback("/A\+/", "replaceCallback", $subject);

echo $result;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top