1

検索/置換機能のテスト中にメモリの問題が発生しました。

検索対象は次のとおりです。

$subject = "

A+マガジンに記事を書きました。 それは非常に長く、言葉でいっぱいです。 このテキストのすべての A+ インスタンスをリンクに置き換えたい A+専用ページへ。

";

検索する文字列:

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

置換関数のコールバック:

関数 replaceCallback($match)
    {
      if (is_array($match)) {
          return '<a class="tag" rel="tag-definition" title="クリックして、' .stripslashes($match[0]) . '" href="?tag=' . $match[0] の詳細を確認してください. '>' . stripslashes($match[0]) . '</a>';
      }
    }

そして呼び出し:

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

これで、完全な検索パターンがデータベースから取得されます。現在のところ、次のとおりです。

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

この $find パターンは、7 つの mysql テーブルの 23 列で検索されます (見つかった場合は置き換えられます)。

preg_replace_callback() の代わりに提案された preg_replace() を使用すると、メモリの問題は解決したようですが、途中で新しい問題が発生しています: preg_replace() によって返された件名に多くのコンテンツがありません...

アップデート:

コンテンツの損失は preg_quote($find,'/'); の使用によるものです。プロセス後に「A」になる「A+」を除いて、現在は機能しています。

4

3 に答える 3

2

エラーを再現しようとしていますが、最初に修正する必要がある解析エラーがあります。これは、良いサンプルになるには十分なコードではないか、本当にバグがあるかのどちらかです。

まず、$find に格納する値はプル パターンではないため、パターン区切り文字を追加する必要がありました。

次に、置換文字列にアンカー タグの終了要素が含まれていません。

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

このコードは機能しますが、それがあなたの望むものかどうかはわかりません。また、preg_replace_callback() はまったく必要ないという強い疑いがあります。

于 2009-03-31T14:39:22.877 に答える
1

これは私にとってはうまくいきます。preg マッチを少し変更する必要がありましたが、すべての A+ がリンクに変わります。最後に a もありません</a>

$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;
于 2009-03-31T14:31:47.687 に答える
0

わかりました - これで、コールバックを使用している理由がわかりました

まず、コールバックをこれに変更します

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 コマンドは何の役にも立ちません。

メモリの問題に対処する限り、パターンを複数のパターンに分割し、それらをループで実行することをお勧めします。あなたの試合は、PHPが1回の呼び出しサイクルで処理するには大きすぎる/複雑すぎると思います。

于 2009-03-31T16:09:41.397 に答える