2012-02-15 13 views
0
私は私のワードプレスに次のコードを使用してい

インストール:preg_replace_callbackエラー

function add_glossary_links($content) { 
    global $wpdb, $wordlist; 
    if (!$wordlist && !$wordlist = get_option('wordlist')) { 
     mysql_query('SET SESSION group_concat_max_len = 100000'); 
     $wordlist = $wpdb->get_var('SELECT GROUP_CONCAT(DISTINCT post_title SEPARATOR "|") AS list FROM '.$wpdb->posts.' WHERE post_status="publish" AND post_type="glossary" AND post_parent>0'); 
     add_option('wordlist', $wordlist); 
    } 

    $wordlist = str_replace(array(" ", "'", "."), array("\s", "\'", "\."), $wordlist); 
    echo $wordlist; 

    $content = preg_replace_callback(
     '/\b('.$wordlist.')\b/i', 
     create_function(
      '$matches', 
      'return "<a href=\"/glossary/" . strtolower(substr($matches[0],0,1) . "/" . $matches[0]) . "/\">" . $matches[0] . "</a>";' 
     ), 
     $content 
    ); 

    return preg_replace('/(<[^<]+)<a\s.*?>(.*?)<\/a>/si','$1$2', $content); 
} 

add_filter('the_content', 'add_glossary_links'); 

アイデアは、私は私のデータベースからの単語のリストを取得するということです。それらが存在する場合は、適切な用語集へのリンクで置き換えます。

$wordlistは、このようにしてエコーさ:http://pastebin.com/6XnWBJwM

私が受けてるエラーはこれです:

Warning: preg_replace_callback(): Unknown modifier 'c' in /my.website/wp-content/themes/mytheme/functions.php on line 384

ライン384は、このセグメントの最後の行です:

$content = preg_replace_callback(
     '/\b('.$wordlist.')\b/i', 
     create_function(
      '$matches', 
      'return "<a href=\"/glossary/" . strtolower(substr($matches[0],0,1) . "/" . $matches[0]) . "/\">" . $matches[0] . "</a>";' 
     ), 
     $content 
    ); 

正規表現の書式設定や単語リストの表示方法に問題があると推測しますが私はそれを私の人生のために知ることはできません。事前に

おかげで、

答えて

1

言葉の一つは終わりの区切り文字として解釈されていることで/を、持っているため、このエラーを取得しています。その後のものは修飾子として解釈され、 "c"はそれらの1つとしては無効です。

入力はpreg_quote()で実行する必要がありますが、クエリの値を連結しているので、これはそのままでは機能しません。

GROUP_CONCATを使用せず、代わりに各単語を独自の行に入れることをお勧めします。次に、行を取り、単語で配列を塗りつぶします。最後に、implode("|",array_map("preg_quote",$words,array_fill(0,count($words),"/")))を使用し、それをあなたの正規表現に入れてください。

+1

第2引数のない 'preg_quote()'は '/'をエスケープしないことに注意してください。 – alex

+0

編集時に修正されました。ありがとう。 –

+0

私はGROUP_CONCATを使用しています。なぜなら、高速化のために私に提案されたからです。リストはデータベースの1,750行から派生しています。 SQLを変更せずに他の方法がありますか? – dunc

1

あなたはpreg_quote()を通じて$wordlistを実行する必要があります。

$safeWordlist = implode('|', 
        array_map(function($word) { return preg_quote($word, '/'); }, 
        explode('|', $wordlist)) 
         ); 

CodePad

独自のエスケープ方法をロールバックしないでください:)

+0

こんにちは。うん、私は 'str_replace'を削除することを意味しました。アレイ内の〜1750エントリで使用すると、コードが速度に影響しますか? – dunc

+0

@duncおそらく。また、正規表現の制限を監視する必要があります。これはメモリから65kに制限されています。 – alex

+0

これをどのように回避できるかについてのご意見はありますか?それは本当にできるだけ早くする必要があります。 WPSEの私のOPから入手可能な詳細:http://wordpress.stackexchange.com/questions/41667/ – dunc

関連する問題