preg_replace_callback () bellek sorunu

3 Cevap php

Bir find / replace fonksiyonunu test ederken ben bir hafıza sorunu yaşıyorum.

Arama tabidir ki:

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

";

bulunabilir dize:

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

replace fonksiyonu geri arama:

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

ve çağrı:

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

Şimdi, tam aranan model veritabanından çekilmektedir. Şu an itibariyle, o:

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

(Bulursa ve değiştirilmesi) Bu $ find model daha sonra 7 mysql tablolar genelinde 23 sütunlarda aranacaktır.

Yerine preg_replace_callback ve önerilen preg_replace () () kullanarak bellek sorunu çözmüş gibi görünüyor, ama ben yolda yeni sorunlar yaşıyorum: preg_replace tarafından döndürülen konu () içerik çok eksik ...

GÜNCELLEME:

the content loss is due to using preg_quote($find,'/'); It now works, except for... 'A+' which becomes 'A ' after the process.

3 Cevap

Tamam - Eğer geri arama kullanıyorsanız neden, şimdi görebiliyorum

Her şeyden önce, ben bu için geri arama değiştirmek istiyorum

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

Stripslashes komutlar herhangi bir yararı olacak değildir.

Bildiğim kadarıyla bellek sorunu adresleme gibi, birden kalıpları içine desen yıkmak ve bir döngü içinde onları çalıştırmak isteyebilirsiniz. PHP tek bir çağrı döngüsünde ele için maç sadece çok büyük / karmaşık olduğunu düşünüyorum.

Ben hata yeniden çalışıyorum ama ilk sabit gereken bir ayrıştırma hatası var. Bu iyi bir örnek olmak için yeterli bir kod değildir ya bir hata gerçekten var ya.

Her şeyden önce, size $ find saklamak değer bir çekme desen değil - yani desen ayraçları eklemek zorunda kaldılar.

İkincisi, senin yerine dize çapa etiketleri için kapatma elemanı içermez.

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

Bu kod çalışır, ama ne istediğiniz emin değilim. Ayrıca, ben hiç preg_replace_callback () gerekmez kuvvetli şüphe sahibiz.

Burada bu benim için çalışıyor, ben gebelik maç biraz değiştirmek zorunda kaldı ama o bir bağlantı içine benim için her A + döner. Ayrıca, sonunda bir </a> eksik.

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