首页 > 解决方案 > Preg_replace 多次

问题描述

在我的 WordPress 安装中,我无权访问 functions.php 或 header.php。

我需要在某些页面的头部替换一些元数据。

我试过这个:

//get header
ob_start();
get_header();
$header_content = ob_get_contents();
ob_end_clean();

echo preg_replace('/<meta property="og:image" content="(.*)">/i','<meta property="og:image" content="image path" />', $header_content);
echo preg_replace('/<meta property="og:url" content="(.*)">/i','<meta property="og:image" content="url path" />', $header_content);

但只有第一行 (og:image) 被替换。

我也尝试过将 preg_replace 作为数组进行,并且发生了同样的问题。

我可以替换多行吗?

标签: phpwordpress

解决方案


您可以访问创建任意 .PHP 文件而无法访问functions.phpor文件,这似乎很奇怪header.php……但我离题了:

查看 的文档preg_replace(),默认情况下它会替换无限次,因此它应该匹配调用时可用的每个实例。

我敢打赌,您的代码是在所有内容都内置到标头中之前执行的。您最好找出正在使用哪些挂钩将该代码添加到您的标题中,并编写一个以较低优先级挂钩到最后一个挂钩的函数。

不过,作为一种快速解决方法,特别是因为听起来您不一定完全控制该站点,因此将使用template_redirect挂钩上的输出缓冲区。如果有任何东西被烘焙到旧模板/插件中,或者出于某种原因我无法用钩子过滤/删除的东西(并且预算不允许重建,哈哈),这通常是我所做的:

add_action( 'template_redirect', 'so62564906_global_find_replace', 99 );
function so62564906_global_find_replace(){
    ob_start( function( $buffer ){
        /**
         * $buffer should contain all your markup for the page.
         * Be VERY careful as to what you modify.
         */

        $buffer = preg_replace( '/<meta property="og:image" content="(.*)">/i', '<meta property="og:image" content="image path" />', $buffer );
        $buffer = preg_replace( '/<meta property="og:url" content="(.*)">/i', '<meta property="og:image" content="url path" />', $buffer );

        return $buffer;
    });
}

如果这不起作用,那么您的代码可能正在preg_replace工作,并且由于拼写错误、属性的不同顺序、不同数量的空格等原因,您的元标记的不同实例没有被匹配。


推荐阅读