2013-10-07 26 views
1

是否有可能使preg_replace解析函数中的变量?函数内Preg_replace变换参数

我期待将[shorturl]full-url[/shorturl]转换为可点击的短网址。

我想是这样的:

$code = array(
     ... 
     '#\[shorturl\]((?:ftp|https?)://.*?)\[/shorturl\]#i' => '<a href="'.file_get_contents("http://...some_api?url=$1").'">$1</a>', 
     ... 
    ) 

    $result = preg_replace(array_keys($code), array_values($code), $text); 

但是,这不作品...此API收到“$ 1”的网址,而不是实际的URL。

有什么想法?

+0

不应该''some_api?url = $ 1'在引号中? – 2013-10-07 01:06:13

+0

谢谢。我编辑了这个问题。我试过它在报价中,但不起作用。 – user2840318

回答

0

这是行不通的。

查看您示例的执行顺序:任何file_get_contents都会在调用preg_replace之前执行。

但您希望正则表达式的结果作为函数调用的一部分。解决方案:preg_replace_callback。每次找到匹配时,此函数都会调用您的代码。例如:

preg_replace_callback('#\[shorturl\]((?:ftp|https?)://.*?)\[/shorturl\]#i', 
    function($a) { 
     return '<a href="'. 
       file_get_contents('http://...some_api?url='.$a). 
       '">'.$a.'</a>'; 
    }, $text 
); 

我没有测试它,但给你一个想法。