Pregunta

Estoy teniendo un problema de memoria mientras se prueba el hallazgo / función de reemplazar.

Di la materia búsqueda es:

$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 cadena que se encuentra:

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

reemplazar la función de devolución de llamada:

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

y la llamada:

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

Ahora, el patrón buscado completa se extrae de la base de datos. A partir de ahora, es:

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

Este hallazgo $ secuencia y después se busca (y reemplazado si se encuentra) en 23 columnas 7 a través de las tablas de MySQL.

Uso de la preg_replace sugerido () en lugar de preg_replace_callback () parece haber resuelto el problema de memoria, pero estoy teniendo problemas nuevos por el camino: el sujeto devuelto por preg_replace () no se encuentra una gran cantidad de contenido ...

ACTUALIZACIÓN:

la pérdida de contenido es debido al uso de preg_quote ($ encontrar, '/'); Ahora funciona, excepto por ... 'A +' que se convierte en 'A' después del proceso.

¿Fue útil?

Solución

Bien - yo puedo ver, ahora, por qué usted está utilizando la llamada de retorno

En primer lugar, me gustaría cambiar de devolución de llamada para este

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

Los comandos stripslashes no van a hacer ningún bien.

En cuanto a abordar el problema de memoria, es posible que desee romper su patrón en varios patrones y ejecutarlos en un bucle. Creo que su partido es demasiado grande / complejo para PHP para manejarlo en un solo ciclo de llamadas.

Otros consejos

Estoy tratando de reproducir el error, pero hay un error de análisis que necesita ser fijado en primer lugar. O no es suficiente código para ser una buena muestra o no es realmente un error.

En primer lugar, el valor se almacena en $ hallazgo no es un patrón de tracción - por lo que he tenido que añadir los delimitadores de patrones

.

En segundo lugar, su cadena de reemplazo no incluye el elemento de cierre para las etiquetas de anclaje.

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

Este código funciona, pero no estoy seguro de que es lo que desea. Además, tengo tienen fuerte sospecha de que no es necesario preg_replace_callback () en absoluto.

Esto funciona para mí aquí, he tenido que cambiar el partido preg un poco pero resulta cada A + para mí en un enlace. También se echa en falta un </a> al final.

$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;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top