Wordpress过滤器:`content_save_pre` hook无法仅使用`preg_replace`函数替换内容

时间:2017-08-10 00:16:17

标签: php wordpress

我需要在保存之前替换post_content中的代码块防护。帖子内容在本地写下来,推送到github,然后是Wordpress。

我需要将markdown fencing ```js <some code> ```替换为:[js] <some code> [/js],然后再保存到Wordpress。

请参阅我的工作代表:https://repl.it/KDz2/1 我的功能在Wordpress之外完美运行。

Wordpress正在调用该函数,但由于某种原因,替换失败了。我知道这是因为我可以在Wordpress中使用一个简单的str_replace来正常工作。

问题;

preg_replace无法在Wordpress过滤器中返回替换的内容。没有错误抛出。为什么这会失败?

<小时/> 作为参考,我的functions.php文件包括:

add_filter( 'content_save_pre', 'markdown_code_highlight_fence');
function markdown_code_highlight_fence( $content ) {
  $newContent = preg_replace('/^ *(`{3,}|~{3,}) *(\S+)? *\n([\s\S]+?)\s*\1 *(?:\n+|$)/m', '
      [${2}]
      $3
      [\\\${2}]
    ', $content);

  return $newContent;
}

也试过这个

function markdown_code_highlight_fence( $content ) {
  $newContent = preg_replace_callback('/^ *(`{3,}|~{3,}) *(\S+)? *\n([\s\S]+?)\s*\1 *(?:\n+|$)/m', function($match){  
    $lang = $match[2] == '' ? 'js' : $match[2];
    return '
      ['.$lang.']'
      .' '.
      $match[3]
      .' '.
      '[\\'.$lang.']';  }, $content);

  return $newContent;
}

1 个答案:

答案 0 :(得分:0)

不确定为什么preg_replace无法在Wordpress中运行。如果有人能帮忙解决问题,请做。

在此期间,我有一个工作解决方案如下:

add_filter( 'content_save_pre', 'markdown_code_highlight_fence_replace', 1, 1);
function markdown_code_highlight_fence_replace( $content ) {
  preg_match_all('/`{3,}(\S+)?/', $content, $matches);

  foreach ($matches[1] as $key=>$match) {
    if($match === '') continue;
    $content = preg_replace('/`{3,}/', '[/'.$match.']', $content, 2);
    $content = str_replace('[/'.$match.']'.$match, '['.$match.']', $content);
  }

  return $content;
}