为什么我的preg_place不能与Content_SAVE_PRE一起使用?

时间:2014-04-02 作者:Tom Oakley

我已经编写了一个过滤器函数,用我网站上传目录中的URL替换帖子中的所有图像URL。但是,当使用content_save_pre, 过滤它实际上不会工作-但是如果我使用content_edit_pre 过滤器,它工作。这是我的代码:

$oldPostContent = $post->post_content; // pass old content into function as argument
function get_the_post_imgs($oldPostContent) {
    global $post;
    $newPostContent = $oldPostContent;
    $newPostContent = preg_replace_callback(
        "/<img.*src=[\\"\']([^\\"\']*)[\\"\'].*>/i", // pattern to match to (i.e the contents of an <img src="..." /> tag)
        function ($match) {
            return "hello world"; // obviously it\'s a lot more complicated than this but for your sake i\'ve massively simplified it so the src="..." content is just replaced with "hello world" for now
        },
        $oldPostContent
    );

    return $newPostContent; // return new manipulated content
}

add_filter(\'content_save_pre\', \'get_the_post_imgs\'); // this doesn\'t work on the content, but if I use content_edit_pre, it does work
在此过程中,我添加了一些评论来帮助您。我很确定正则表达式没有问题(http://regex101.com/r/aP4fU9) 这与我的代码不正常工作有关content_save_pre 需要它来工作。

感谢您的帮助:)

1 个回复
最合适的回答,由SO网友:Pat J 整理而成

我将您的代码复制到Ubuntu盒上我的主目录中的一个文件中,已删除the weird character that @s_ha_dum noticed, 然后运行它。正如我所预料的那样。

代码:

<?php

function get_the_post_imgs($oldPostContent) {
    $newPostContent = $oldPostContent;
    $newPostContent = preg_replace_callback(
        "/<img.*src=[\\"\']([^\\"\']*)[\\"\'].*>/i", // pattern to match to (i.e the contents of an <img src="..." /> tag)
        function ($match) {
            return "hello world"; // obviously it\'s a lot more complicated than this but for your sake i\'ve massively simplified it so the src="..." content is just replaced with "hello world" for now
        },
        $oldPostContent
    );

    return $newPostContent; // return new manipulated content
}

echo get_the_post_imgs( \'<a href="foo.php"><img align="right" src="http://example.com/fire.gif" /></a><br />\' );

?>
从命令行运行此代码:

% php -e foo.php 
<a href="foo.php">hello world
您的正则表达式对于您的目的可能有点贪婪,但它确实有效。

PS,试着用奇怪的字符运行代码:

% php -e foo.php
PHP Parse error:  syntax error, unexpected \'"/<img.*src=[\\"\']([^\\"\']*)[\\"\'\' (T_CONSTANT_ENCAPSED_STRING) in /home/username/foo.php on line 6
Edit -- 既然你在评论中问到了,我想我应该试着为你编一个不那么贪婪的正则表达式。试试这个尺码:

<img.*src=[\\"\']([^\\"\']*)[\\"\'][^>]*>
额外的[^>*] 末尾的术语结束<img...> 结束时标记>, 而不是结转到最后> 在这行中(在我的示例中,结束语></a> 标签)。

结束

相关推荐

为什么Apply_Filters在循环内部和外部的行为不同?

What I want: 通过创建$query = new WP_Query($args);Why: 以json格式返回特定内容,作为一种API请求,准备在另一个站点上显示What I tried first:foreach($query->posts as $post) { $post->post_content = apply_filters(\'the_content\', $post->post_content); }; 这执行了autop 和do