我在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
);
我认为正则表达式的格式化以及单词列表的显示方式存在问题,但我无法理解它的生活。
提前致谢,
答案 0 :(得分:1)
您应该$wordlist
到preg_quote()
。
$safeWordlist = implode('|',
array_map(function($word) { return preg_quote($word, '/'); },
explode('|', $wordlist))
);
不要推出自己的逃避方法:)
答案 1 :(得分:1)
您收到此错误,因为其中一个单词中包含/
,这被解释为结束分隔符。之后的任何内容都被解释为修饰符,而“c”无效为其中之一。
您应该通过preg_quote()
运行输入,但是由于您在查询中连接了这些值,因此无法实现开箱即用。
我建议不要使用GROUP_CONCAT
,而是将每个单词放在自己的行上。然后,取出行并用单词填充数组。最后,使用implode("|",array_map("preg_quote",$words,array_fill(0,count($words),"/")))
并将其放入正则表达式中。