函数内部的preg_replace变换参数

时间:2013-10-07 01:04:58

标签: php regex

是否可以让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而不是实际url。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

这不起作用。

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

但是你希望正则表达式的结果作为函数调用的一部分。解决方案: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
 );

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