예제 #1
0
function smarty_function_wiseMakeLinkUrl($params, &$smarty)
{
    //兼容处理,在阿拉丁模板中要取reqData字段,主模板中取req
    $reqData = $smarty->getTemplateVars('req');
    $pageData = $smarty->getTemplateVars('page');
    if (empty($reqData)) {
        $reqData = $smarty->getTemplateVars('reqData');
        $pageData = $smarty->getTemplateVars('pageData');
    }
    if (isset($_ENV['HHVM'])) {
        $params['src'] = Wise_Utils::hhvm_htmlspecialchars_decode($params['src']);
    } else {
        $params['src'] = htmlspecialchars_decode($params['src']);
    }
    //移动公共参数,这里不要baiduid是因为在src中拼接的时候不要baiduid,所以放入tc跳转其他参数对象中
    $common_prefix_array = array('from' => $reqData['from'], 'ssid' => $reqData['ssid'], 'uid' => $reqData['uid'], 'bd_page_type' => $reqData['bd_page_type'], 'pu' => $reqData['pu']);
    $common_prefix_str = http_build_query($common_prefix_array, '', '&');
    //tc跳转其他参数
    $common_tc_array = array('baiduid' => $reqData['baiduid'], 'ct' => $params['ct'] ? $params['ct'] : 0, 'cst' => $params['cst'] ? $params['cst'] : 0, 'ref' => $pageData['pageRef'] ? $pageData['pageRef'] : ($params['ref'] ? $params['ref'] : ''), 'lid' => $reqData['lid'] ? $reqData['lid'] : ($reqData['logid'] ? $reqData['logid'] : ''));
    if ($reqData['word']) {
        $common_tc_array['w'] = $reqData['pn'] . '_' . $reqData['rn'] . '_' . $reqData['word'];
    }
    $common_tc_str = http_build_query($common_tc_array, '', '&');
    //添加其他参数
    $other_tc_arr = array();
    foreach ($params as $attr => $value) {
        if (strripos($attr, "other_") !== "false" && strripos($attr, "other_") === 0) {
            $other_tc_arr[substr($attr, 6)] = $value;
        }
    }
    $other_tc_str = http_build_query($other_tc_arr, '', '&');
    //如果设置了pubPath为true,为src后面添加6个公共参数
    if ($params['pubPath']) {
        $params['src'] = $params['src'] . '&' . $common_prefix_str;
    }
    $src = 'src=' . urlencode($params['src']);
    //如果域名不是baidu.com,使用加密插件
    if (!preg_match('/\\.baidu\\.com/', $params['src'])) {
        $src = Wise_String::anti_src(urlencode($params['src']), '&');
    }
    //返回链接格式为移动6公共参数 + tc跳转其他参数
    //src格式为src+移动5公共参数(不要baiduid)
    return 'http://m.baidu.com/tc?l=1&noconvert=1&' . $common_prefix_str . '&' . $common_tc_str . '&' . $other_tc_str . '&' . $src;
}
예제 #2
0
 public static function wordEmTruncate($str, $length = 0, $encoding = 'UTF-8', $endMark = '..', $rawStartLabel = '\\2', $rawEndLabel = '\\3', $outStartLabel = '<em>', $outEndLabel = '</em>', $outputEncoding = 'utf-8')
 {
     //排除结束符 需要截断的长度
     //        $length = $length - strlen($endMark);
     if ($str === '' || $length < 0) {
         return '';
     }
     //add by tianxing for fix bug
     if (strtolower($encoding) == 'gbk') {
         $encoding = 'gb18030';
     }
     if (strtolower($outputEncoding) == 'gbk') {
         $outputEncoding = 'gb18030';
     }
     if (strtolower($encoding) == 'utf8') {
         $encoding = 'UTF-8';
     }
     if (strtolower($outputEncoding) == 'utf8') {
         $outputEncoding = 'UTF-8';
     }
     //删除不可见字符\x01-\x1f
     $invalidStr = array('\\1' => "", '\\2' => "", '\\3' => "", '\\4' => "", '\\5' => "", '\\6' => "", '\\7' => "", '\\10' => "", '\\11' => "\t", '\\12' => "\n", '\\13' => "\v", '\\14' => "\f", '\\15' => "\r", '\\16' => "", '\\17' => "", '\\20' => "", '\\21' => "", '\\22' => "", '\\23' => "", '\\24' => "", '\\25' => "", '\\26' => "", '\\27' => "", '\\30' => "", '\\31' => "", '\\32' => "", '\\33' => "", '\\34' => "", '\\35' => "", '\\36' => "", '\\37' => "");
     if (isset($invalidStr[$rawStartLabel])) {
         unset($invalidStr[$rawStartLabel]);
     }
     if (isset($invalidStr[$rawEndLabel])) {
         unset($invalidStr[$rawEndLabel]);
     }
     //$str = preg_replace("/[".implode("", $invalidStr)."]/",'',$str);
     $str = str_replace($invalidStr, '', $str);
     if (is_string($str)) {
         if (isset($_ENV['HHVM'])) {
             $str = Wise_Utils::hhvm_htmlspecialchars_decode($str);
         } else {
             $str = htmlspecialchars_decode($str);
         }
     }
     $arrStr = array();
     //进入tag模式
     if ($rawStartLabel == 'TAG') {
         //<aa23aa></aa23aa>
         if ($rawEndLabel == '') {
             return $str;
         }
         $arrTags = explode('-', $rawEndLabel);
         //支持用-分割多个tag名
         $tagTmp = array();
         foreach ($arrTags as $tagV) {
             $tagTmp[] = '</' . $tagV . '>';
             $tagTmp[] = '<' . $tagV . '(?:\\s+[^>]*?)?>';
         }
         $regex = implode('|', $tagTmp);
         $regex = '(?:' . $regex . ')';
         if (is_string($str)) {
             $arrStr = preg_split("!{$regex}!", $str, -1);
         }
     } else {
         //普通模式
         if (is_string($str)) {
             $arrStr = preg_split("/[{$rawStartLabel}{$rawEndLabel}]/", $str, -1);
         }
     }
     $returnStr = $subStr = '';
     $subLen = 0;
     //0长度未满足截断要求;
     //1长度已经满足截断要求,且刚好是输入字符串的最后一个字符;
     //2长度已经满足截断要求,但输入字符串后面还有内容
     $isOver = 0;
     $splitCount = count($arrStr);
     if ($arrStr[$splitCount - 1] == '') {
         $splitCount--;
     }
     if ($length == 0) {
         for ($i = 0; $i < $splitCount; $i++) {
             $subStr = $arrStr[$i];
             if ($i % 2 === 0) {
                 $returnStr .= htmlspecialchars($subStr);
             } else {
                 $returnStr .= $outStartLabel . htmlspecialchars($subStr) . $outEndLabel;
             }
         }
     } else {
         $length = $length - strlen($endMark);
         for ($i = 0; $i < $splitCount; $i++) {
             $result = Wise_Utils::wordTruncate($arrStr[$i], $length, $encoding);
             if (is_array($result)) {
                 $subStr = $result[0];
                 $subLen = $result[1];
                 $isOver = $result[2];
             } else {
                 continue;
             }
             if ($i % 2 === 0) {
                 $returnStr .= $subStr;
             } else {
                 if ($isOver == 1) {
                     $result = Wise_Utils::wordTruncate($arrStr[$i], 0, $encoding);
                     $subStr = $result[0];
                     $subLen = $result[1];
                     $isOver = $result[2];
                 }
                 $returnStr .= $outStartLabel . $subStr . $outEndLabel;
             }
             $length = $length - $subLen;
             if ($isOver > 0) {
                 break;
                 //结束
             } else {
                 if ($length <= 0) {
                     break;
                 }
             }
         }
     }
     if ($encoding != $outputEncoding) {
         $returnStr = iconv($encoding, $outputEncoding, $returnStr);
     }
     if ($i < $splitCount - 1 || $i == $splitCount - 1 && $isOver == 1) {
         return $returnStr . $endMark;
     } else {
         return $returnStr;
     }
 }