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; }
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; } }