调用函数而不是在preg_replace_callback中创建一个函数

时间:2016-02-04 07:42:58

标签: php regex preg-replace preg-replace-callback

我试图将旧的preg_replace转换为preg_replace_callback,但努力奋斗。想知道是否有人可以提供帮助。

我的老工作人员:

$pattern = "/\[product\](.+?)\[\/product\]/e";
$text = "Hejsan hoppsan [product]2022|lots of text textext[/product] och sen så händer det lite blandat och så har vi [product]11245| med en jävla massa text[/product]";
echo preg_replace($pattern, "productBox('$1')", $text);

这很方便,因为|之后和[/product]之前没有新行。

[product]2022| like
this
dont
work[/product]

但是否则代码工作正常。

功能:

function productBox($text) {

    global $wpdb;

    $test = explode("|",$text);

    $loopProductID = $test[0];
    $desc = $test[1];

    //sql's to get information about the products

    $productHTML = '<div class="flow-item">
                        <div class="flow-product-image"><a href="'.$permalink.'"><img src="'.$thumburl.'" alt="'.$title.'" /></a></div>
                        <div class="flow-product-info">
                            <h3><a href="'.$permalink.'">'.$title.'</a></h3>
                            <div style="padding: 5px 0px 10px;">'.$desc.'</div>
                            <div class="flow-product-facts">Art.nr: '.$artnr.' - Pris: '.$prisinklmoms.' kr</div>
                        </div>
                        <div class="clear"></div>
                    </div>';

    return $productHTML;

}

我还尝试将整个函数放在preg_replace_callback中,如下所示:

$test = preg_replace_callback($pattern,
                function productBox($matches) {
                global $wpdb;

                $test = explode("|",$matches);

                $loopProductID = $test[0];
                $desc = $test[1];

                //sql's to get information about the products

                $productHTML = '<div class="flow-item">
                                    <div class="flow-product-image"><a href="'.$permalink.'"><img src="'.$thumburl.'" alt="'.$title.'" /></a></div>
                                    <div class="flow-product-info">
                                        <h3><a href="'.$permalink.'">'.$title.'</a></h3>
                                        <div style="padding: 5px 0px 10px;">'.$desc.'</div>
                                        <div class="flow-product-facts">Art.nr: '.$artnr.' - Pris: '.$prisinklmoms.' kr</div>
                                    </div>
                                    <div class="clear"></div>
                                </div>';

                return $productHTML;

            }
            , $text);

返回白页。

//sql's to get information about the products包含了相当多的sql,所以我把它拿走了,因为它会是一个很长的帖子,并且sql工作正常。

任何可以帮助我的人?​​

最好的解决方案是如果我可以使用它而不在preg_replace_callback内部使用该函数,因为代码将在更多地方使用并且反复创建函数似乎很糟糕以防我必须改变其中的一些东西。所以我宁愿只是调用函数。

或者有没有办法多方可做呢?把整个东西放在一个函数中,然后像myGoodFunction($text_I_want_fixed);一样调用它?

[product]productid|Text about the product to show[/product]

这就是它现在制作的方式,我一直在考虑尝试更改正则表达式以使它像[product id="productid"]Text[/product]那样,但这是后来的修复。只是想弄清楚如何修复preg_replace_callback

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您需要传递匿名函数,而不是命名函数:

preg_replace_callback($pattern, function ($matches) { ... }, $text);
//                    look ma, no name! ^

否则会出现语法错误。

另一种方法是定义一个命名函数并将其作为回调传递:

function productBox($matches) { ... }

preg_replace_callback($pattern, 'productBox', $text);
//           pass a callback by name ^