preg_replace_callback返回空

时间:2014-04-01 17:26:20

标签: php preg-replace preg-replace-callback

首先,我应该说这是一个基于WordPress的问题,我最初在WordPress StackExchange上询问here。但我认为它变成了一个更基于PHP的问题,所以这就是我在这里问的原因。

基本上,我已经编写了这个preg_replace_callback函数,在保存/发布帖子时,它将用WP Uploads目录中的URL替换所有图像URL。我有这个短暂的成功;有时它可以工作,但仅限于其中一个网址(在我的网站上的测试示例中,我有3个img标记,每个标记都用段落分隔。

这是我的代码:

add_filter('content_save_pre', 'getpostimgs'); // content_save_pre filter may be depreceated? => http://adambrown.info/p/wp_hooks/hook/content_save_pre

function getpostimgs() {
    global $post;

    $postContent = $post->post_content;

    $content = preg_replace_callback(
        '/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', // pattern to match to (i.e the contents of an <img src="..." /> tag)
        function ($match) {
            $imgURL = $match[1]; // the second array (#1) (0-based) is the array with the URLs in. First array (#0) has the whole img tag in.

            $image_data = file_get_contents($imgURL); // Get image data
            $filename   = basename($imgURL) . "-" . $post->ID . ".jpg"; // Create image file name

            if( wp_mkdir_p( $upload_dir['path'] ) ) { // check upload file exists and the permissions on it are correct
                $file = $upload_dir['path'] . '/' . $filename;
            } else {
                $file = $upload_dir['basedir'] . '/' . $filename;
            } // save file to server

            file_put_contents( $file, $image_data ); // save the file to the server

            return $file;
        },
        $postContent
    );

    return $content;
}

我在前面添加了一些评论,希望能够解释我在每个阶段所做的工作。我不是PHP向导(我主要做WordPress PHP)所以要好!另外,正如我在评论中所说,我正在使用的WordPress过滤器content_save_pre,它应该在保存到数据库之前编辑内容,已经depreciated。但这是一个WordPress问题,所以我会咨询关于那个问题的WordPress Stackexchange上的人。

无论如何,我的主要问题是,当我点击保存时,内容被完全擦除。正如我上面所说,我已经取得了短暂的成功 - 有时它会取代其中一个URL,有时则不会取代,而且大多数时候它只会擦除所有内容。我假设preg_replace_callback出了问题。

最后:正如您从我发布到Wordpress StackExchange的链接(右上角)中看到的那样,我最初通过使用preg_match_all来查找所有图片网址,然后使用{ {1}}循环遍历网址数组,并使用foreach替换网址。如果您想查看该代码,则该代码为here。我根据this thread的建议改变了它(正确答案)。但这两种方法的行为基本相同。

感谢您的帮助:)

编辑:我稍微更新了我的代码,在全局变量/变量范围和一些语法/ WP错误方面犯了一些愚蠢的错误。这是我更新的代码:

prey_replace

如果我在single.php页面上调用此函数,它将起作用,即返回的帖子内容中的原始图像URL已被上载目录URL替换,因此正则表达式和内容是正确的。但是,当我尝试发布/更新帖子时(内容通常被擦除),它不起作用。有什么想法吗?

0 个答案:

没有答案