preg_replace_callback错误

时间:2012-02-15 22:39:53

标签: php regex

我在WordPress安装中使用以下代码:

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

我认为正则表达式的格式化以及单词列表的显示方式存在问题,但我无法理解它的生活。

提前致谢,

2 个答案:

答案 0 :(得分:1)

您应该$wordlistpreg_quote()

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

CodePad

不要推出自己的逃避方法:)

答案 1 :(得分:1)

您收到此错误,因为其中一个单词中包含/,这被解释为结束分隔符。之后的任何内容都被解释为修饰符,而“c”无效为其中之一。

您应该通过preg_quote()运行输入,但是由于您在查询中连接了这些值,因此无法实现开箱即用。

我建议不要使用GROUP_CONCAT,而是将每个单词放在自己的行上。然后,取出行并用单词填充数组。最后,使用implode("|",array_map("preg_quote",$words,array_fill(0,count($words),"/")))并将其放入正则表达式中。