Gavin

修改wordpress代码高亮插件CodeColorer使之兼容PHP7

VPS升级为PHP7后,发现以前的文章各种错误提示,惨不忍睹,目标直至代码高亮插件CodeColorer

查了下原因,问题出在preg_replace这个函数的/e修饰符上,参考官方文档

更新日志

版本 说明
5.5.0 /e 修饰符已经被弃用了。使用 preg_replace_callback() 代替。参见文档中 PREG_REPLACE_EVAL 关于安全风险的更多信息。

解决方案自然是修改源代码了


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<?php
//源代码
$content = preg_replace('#(\s*)\[cc([^\s\]_]*(?:_[^\s\]]*)?)([^\]]*)\](.*?)\[/cc\2\](\s*)#sie', '$this->PerformHighlightCodeBlock(\'\\4\', \'\\3\', $content, \'\\2\', \'\\1\', \'\\5\');', $content);
$content = preg_replace('#(\s*)\<code(.*?)\>(.*?)\</code\>(\s*)#sie', '$this->PerformHighlightCodeBlock(\'\\3\', \'\\2\', $content, \'\', \'\\1\', \'\\4\');', $content);
//修改后
$content = preg_replace_callback('#(\s*)\[cc([^\s\]_]*(?:_[^\s\]]*)?)([^\]]*)\](.*?)\[/cc\2\](\s*)#si', function($r){
    return $this->PerformHighlightCodeBlock($r[4], $r[3], $content, $r[2], $r[1], $r[5]);
}, $content);
$content = preg_replace_callback('#(\s*)\<code(.*?)\>(.*?)\</code\>(\s*)#si', function($r){
    return $this->PerformHighlightCodeBlock($r[3], $r[2], $content, '', $r[1], $r[4]);
}, $content);



//源代码
$text = preg_replace('~&#x0*([0-9a-f]+);~ei', 'chr(hexdec("\\1"))', $text);
$text = preg_replace('~&#0*([0-9]+);~e', 'chr(\\1)', $text);
//修改后
$text = preg_replace_callback('~&#x0*([0-9a-f]+);~i', function($r){
    return chr(hexdec($r[1]));
}, $text);
$text = preg_replace_callback('~&#0*([0-9]+);~', function($r){
    return chr($r[1]);
}, $text);



//源代码
$content = preg_replace('#(\s*)(\[cc[^\s\]_]*(?:_[^\s\]]*)?[^\]]*\].*?\[/cc\1\])(\s*)#sie', '$this->PerformProtectComment(\'\\2\', $content, \'\\1\', \'\\3\');', $content);
$content = preg_replace('#(\s*)(\<code.*?\>.*?\</code\>)(\s*)#sie', '$this->PerformProtectComment(\'\\2\', $content, \'\\1\', \'\\3\');', $content);
//修改后
$content = preg_replace_callback('#(\s*)(\[cc[^\s\]_]*(?:_[^\s\]]*)?[^\]]*\].*?\[/cc\1\])(\s*)#si', function($r){
    return $this->PerformProtectComment($r[2], $content, $r[1], $r[3]);
}, $content);
$content = preg_replace_callback('#(\s*)(\<code.*?\>.*?\</code\>)(\s*)#si', function($r){
    return $this->PerformProtectComment($r[2], $content, $r[1], $r[3]);
}, $content);




//源代码
$text = preg_replace('/(< \?php)/i', '<?php', $text);
$text = preg_replace('/(?:^(?:\s*[\r\n])+|\s+$)/', '', $text);
//修改后
$text = preg_replace_callback('/(< \?php)/i', function($r){
    return '<?php';
}, $text);
$text = preg_replace_callback('/(?:^(?:\s*[\r\n])+|\s+$)/', function($r){
    return '';
}, $text);
码字很辛苦,转载请注明来自淡兰色的海洋《修改wordpress代码高亮插件CodeColorer使之兼容PHP7》

评论

  1. libo #1

    不要随意改源码

    回复
    2016-01-20
    • Gavin

      n年无更新的插件源码,淡定

      回复
      2016-01-21