Domanda

sto avendo un problema di memoria durante la prova di un ritrovamento / funzione di sostituzione.

Di 'la ricerca soggetto è:

$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 stringa da trovare:

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

la funzione di callback sostituzione:

 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>';
      }
    }

e la chiamata:

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

Ora, il pattern cercato completa è tratto dal database. A partire da ora, è:

$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';

Questo ritrovamento modello $ è poi cercato (e sostituito se trovato) in 23 colonne in 7 tabelle di MySQL.

Uso della preg_replace suggerito () al posto di preg_replace_callback () sembra aver risolto il problema di memoria, ma sto avendo nuovi problemi lungo il percorso: il soggetto restituito da preg_replace () manca un sacco di contenuti ...

UPDATE:

la perdita di contenuto è dovuta all'utilizzo funzione preg_quote ($ trovare, '/'); E 'ora funziona, tranne che per ... 'A +' che diventa 'A' dopo il processo.

È stato utile?

Soluzione

Va bene - posso vedere, ora, il motivo per cui si sta utilizzando il callback

Prima di tutto, vorrei cambiare il callback a questo

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;
}

I comandi stripslashes non stanno andando a fare alcun bene.

Per quanto riguarda affrontare il problema di memoria, si consiglia di abbattere il vostro modello in più modelli ed eseguirli in un ciclo. Credo che il tuo partner è semplicemente troppo grande / nel complesso per il PHP per gestire in un unico ciclo di chiamate.

Altri suggerimenti

Sto cercando di riprodurre l'errore, ma c'è un errore di analisi che deve essere risolto prima. O questo non è il codice abbastanza per essere un buon campione o c'è veramente un bug.

Prima di tutto, il valore si memorizza in $ find non è un modello di pull - così ho dovuto aggiungere delimitatori modello

.

In secondo luogo, la vostra sostituire stringa non include l'elemento di chiusura per i tag di ancoraggio.

$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;

Questo codice funziona, ma non sono sicuro che è quello che vuoi. Inoltre, ho avere il forte sospetto che non hai bisogno di preg_replace_callback () a tutti.

Questa qui funziona per me, ho dovuto cambiare la partita preg un po 'ma si scopre ogni A + per me in un link. Inoltre manca un </a> alla fine.

$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;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top