0

我正在尝试使用 preg_match_all 在文本中查找模式的实例,然后使用该模式来实例化一个类,最后调用一个类函数来打印匹配模式的替换文本。我不知道我是否以正确的方式去做。

我可以用这个 preg_replace 函数找到并替换这个模式 [bandcamp=http://bandcamp-page.com]1[/bandcamp]

$text = preg_replace ("/\[bandcamp=(.+?)\](.+?)\[\/bandcamp\]/", "replacement text here", $text);

但我想使用匹配来创建一个 BandcampAlbum 对象并调用它的 player() 函数来打印出 html。这是我正在尝试的,但到目前为止无济于事。

if (preg_match_all ("/\[bandcamp=(.+?)\](.+?)\[\/bandcamp\]/", $text, $matches)) {

    foreach ($matches[0] as $match) {
        preg_replace ("/\[bandcamp=(.+?)\](.+?)\[\/bandcamp\]/", "", $text);
        $bc = new BandcampAlbum($match[0], $match[1]);
        $bc->player();
    }

}

foreach 循环中的 preg_replace 旨在摆脱匹配的文本。匹配似乎有效,所以我猜我做错了,而不是犯了正则表达式错误。欢迎任何建议。

4

1 回答 1

1

如评论中所述;您可能追求的是preg_replace_callback。以下是它在您的问题中的用法示例:

function getBandCampMarkup($matches){
    $bc = new BandcampAction($matches[1], $matches[2]);
    return $bc->player();
}

$data = preg_replace_callback("/\[bandcamp=(.+?)\](.+?)\[\/bandcamp\]/", "getBandCampMarkup", $data);
echo $data;

这当然是假设$bc->player()返回一个输出字符串。如果此函数只是回显数据,那么您可以使用ob_startandob_get_clean将输出捕获为字符串,如下所示:

ob_start();
$bc->player();
return ob_get_clean();
于 2013-08-14T16:38:19.700 回答