【问题标题】:PHP preg_match and replace multiple instances between tagsPHP preg_match 并替换标签之间的多个实例
【发布时间】:2020-01-02 08:55:13
【问题描述】:

对不起,如果标题有点混乱,很难解释,所以我会尽力:)

好的,我有一个博客,在后端我希望能够为帖子中的每个产品添加多个画廊

示例博客:

Some Product Title 1
blah blah blah blah
[Gallery::product_id_01]

Some Product Title 2
blah blah blah blah
[Gallery::product_id_02]

因此,在此示例中,有 2 个产品,每个产品都有一个 Gallery 标签。 我希望能够找到并替换这些示例标签 [Gallery::product_id_01][Gallery::product_id_02] 使用实际的图片库,这是通过一个名为 ProdImgGallery() 的 php 函数完成的,这传递了相同的 ID 示例:product_id_01

标签将始终具有[Gallery::*],但 * 指示的 :: 后面的文本会有所不同,需要从标签中捕获以用于下一阶段。

使用preg_match_all("/\[Gallery::([^\]]*)\]/", $blog_content, $product_id); 可以按照您的预期找到所有标签,但我需要将标签替换为由其唯一 ID 指示的正确图库

这是我所能得到的,但这只是根据preg_match_all 找到的所有 id 获取每个画廊我不知道如何用相应的画廊替换每个画廊

//Find all Matches and put in array    
preg_match_all("/\[Gallery::([^\]]*)\]/", $blog_content, $product_id);

//Count all matches
$all_matches = count($product_id[1]);

//Loop through them
for($x=0;$x<$all_matches;$x++)
{
echo $product_id[1][$x]."<br>";
$prod_img_gallery = ProdImgGallery($product_id[1][$x]);
}
$blog_content = preg_replace("/\[Gallery::([^\]]*)\]/",$prod_img_gallery,$blog_content);

希望这有某种意义,我无法解释事情所以请原谅我 :) 我也尝试过搜索,但找不到与我的确切问题匹配的答案

非常感谢!

【问题讨论】:

  • 这是 PHP 吗?如果是这样,如果您使用标签 PHP 附加问题会有所帮助:为什么不能使用“[Gallery::product_id_01]”作为您的正则表达式?例如for(...) { $target_id=sprintf("/[Gallery::product_id_%02d]/", id); }
  • @Popeye 嗨,对不起,我是这里的菜鸟,没有意识到 - 我的错 - 我不能使用“[Gallery::product_id_01]”,因为这将是动态的
  • 很抱歉,我在完成我的 --answer-- 问题之前点击了保存按钮。我确实理解随机的意义。你能给我一个你的随机线的真实例子吗?
  • @Popeye 我在帖子中说过它会像 '[Gallery::product_id_02]' 但 '::' 之后的 id 将是动态的,例如在写博客时在后端我单击一个按钮,它将添加“[Gallery::]”然后输入产品 ID,例如“[Gallery::product_id_02]”我将在博客文章中添加大约 10 个产品,因此会有一组这些代码中的 10 个都具有唯一的 id - 希望这是有道理的

标签: php preg-replace preg-match str-replace preg-match-all


【解决方案1】:

您可以尝试使用preg_replace_callback:

$input = "Some Product Title 1
blah blah blah blah
[Gallery::product_id_01]

Some Product Title 2
blah blah blah blah
[Gallery::product_id_02]";

$out = preg_replace_callback(
    "/\[Gallery::(.*?)\]/", function($m) {
                                $val = "[Gallery::" . ProdImgGallery($m[1]) . "]";
                                return $val;
                            },
    $input);
echo $out;

这里的想法是捕获[Gallery::...] 的每次出现,然后将捕获的组传递给回调函数。上述脚本使用内联匿名函数进行回调,然后使用 ProdImgGallery() 函数返回您想要的替换。

【讨论】:

  • 非常感谢在玩了它的作品之后!!! - 我必须将 $val = "[Gallery::" . ProdImgGallery($m[1]) . "]"; 编辑为 $val = ProdImgGallery($m[1]) ; 以删除显示为文本的 [Gallery 部分。我会做一个完整的测试以确保 - 谢谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-21
  • 2011-07-28
  • 2013-11-26
  • 1970-01-01
  • 2017-04-20
  • 1970-01-01
相关资源
最近更新 更多