php - 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 作为数组进行,并且发生了同样的问题。
我可以替换多行吗?
解决方案
您可以访问创建任意 .PHP 文件而无法访问functions.php
or文件,这似乎很奇怪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
工作,并且由于拼写错误、属性的不同顺序、不同数量的空格等原因,您的元标记的不同实例没有被匹配。
推荐阅读
- python - 解析url后如何合并两个列表?
- javascript - 跨不同形式的 Chrome 自动填充
- javascript - Javascript Perlin 噪声实现。工件和价值绑定
- python-3.x - Itertools 组合错误/内存问题
- delphi - 我怎么知道一个 TLabel 单词是否包裹了文本?
- python - Filter Where clause in SqlAlchemy
- jquery - jQuery - 如果变量在元素内匹配,则样式
- python - removing a row and column at the same time python
- python - 线程池是如何工作的,以及如何在 NodeJS 之类的 async/await 环境中实现它?
- c# - Do I need to pass in the url to call a WCF web service?