Pergunta

eu estou tendo um problema de memória ao testar um find / substituir função.

Say o tema de pesquisa é:

$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+.

";

a string a ser encontrado:

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

a substituir a função de retorno de chamada:

 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 a chamada:

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

Agora, a completa procurou padrão é retirado do banco de dados. A partir de agora, é:

$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 padrão achado $ é, então, olhou para (e substituídos, se for encontrado) em 23 colunas por 7 tabelas MySQL.

Usando o preg_replace sugeriu () em vez de preg_replace_callback () parece ter resolvido o problema de memória, mas eu estou tendo novas questões para baixo o caminho: o sujeito retornado por preg_replace () está faltando um monte de conteúdo ...

UPDATE:

a perda de conteúdo é devido ao uso de preg_quote ($ find, '/'); Ele agora trabalha, exceto para ... 'A +' que se torna 'A' após o processo.

Foi útil?

Solução

Tudo bem - eu posso ver, agora, por que você está usando o callback

Em primeiro lugar, eu mudaria o seu retorno a 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;
}

Os comandos stripslashes não vai fazer nenhum bem.

Quanto abordar a questão da memória, você pode querer quebrar o seu padrão em vários padrões e executá-los em um loop. Eu acho que seu jogo é muito grande / complexo para PHP para lidar com isso em um único ciclo de chamada.

Outras dicas

Eu estou tentando reproduzir seu erro, mas há um erro de análise que precisa ser corrigido primeiramente. Ou esta não é código suficiente para ser um exemplo bom ou há realmente um bug.

Em primeiro lugar, o valor que você armazenar em $ achado não é um padrão de tração - então eu tive que adicionar delimitadores padrão

.

Em segundo lugar, a sua substituir corda não inclui o elemento de fechamento para as marcas de âncora.

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

Esse código funciona, mas eu não tenho certeza que é o que você quer. Além disso, tenho têm uma forte suspeita de que você não precisa preg_replace_callback () em tudo.

Este aqui funciona para mim, eu tive que mudar o preg corresponder um pouco, mas transforma cada A + para mim em um link. Também está faltando um </a> no 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top