大概明白了要实现的功能,不过不是很明白你最后一句.
好像是模板的变量替换问题
是这样吗$format2='<a href="show.php?id={id, 2}">{title, 2}</a>';
echo preg_replace( "/{(\w+)}/Ue", "checkString( '\\1' )", $format2 );
function checkString( $str )
{
   global $arr;
   $param = explode( ", ", $str );
   if ( count( $param ) > 1 )
        return substr( $arr[$param[0], 0, $param[1] );
   else
        return $arr[$param[0]];
}

解决方案 »

  1.   

    另外写一个函数或这样写$format2='<a href="show.php?id={id, 2}">{title, 2}</a>';
    echo preg_replace('/{(\w+)(,\s*(\d+))?}/e', 'substr($arr[\\1], 0, "\\3"?"\\3":strlen($arr[\\1]))', $format2);$format2='<a href="show.php?id={id, 2}">{title}</a>';
    echo preg_replace('/{(\w+)(,\s*(\d+))?}/e', 'substr($arr[\\1], 0, "\\3"?"\\3":strlen($arr[\\1]))', $format2);
      

  2.   

    当没有“, 2”这样的内容时\\3将是空值,造成待执行的函数变成substr('...',0,)这样就违反了函数调用时的格式约定,所以就不行了。
    加上引号后,无论\\3是否有值,就都是有效的参数形式了
    虽然可能期望的是一个数,你却给了一个串。但php会自动将参数的类型转换到期望的类型