PHP preg_match 并替换标签之间的多个实例
PHP preg_match and replace multiple instances between tags
抱歉,如果标题有点混乱,很难解释,所以我会尽力:)
好的,我有一个博客,在后端,我希望能够在 post
中为每个产品添加多个画廊
示例博客:
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);
希望这有点道理,我无法解释事情所以请原谅我:)
我也尝试过搜索,但找不到与我的确切问题相匹配的答案
非常感谢!
您可以尝试使用 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()
函数 returns 替换你想要的。
抱歉,如果标题有点混乱,很难解释,所以我会尽力:)
好的,我有一个博客,在后端,我希望能够在 post
中为每个产品添加多个画廊示例博客:
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);
希望这有点道理,我无法解释事情所以请原谅我:) 我也尝试过搜索,但找不到与我的确切问题相匹配的答案
非常感谢!
您可以尝试使用 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()
函数 returns 替换你想要的。