Help Đặt Link Dofollow không được ??? Trợ giúp

bitdoan

Private
Tham gia
29/07/2016
Bài viết
11
Được Like
4
Đặt Link Dof Cho Xeforo Không Được. Vào String.php Đặt Dofollow rồi vào check cũng không ra Dofollow
Đoạn Code String.php
Mã:
<?php

/**
* Helper to do common string operations, such as word wrap and censoring.
*
* @package XenForo_Helper
*/
class XenForo_Helper_String
{
    /**
     * Censor cache for default words/censor string option.
     *
     * @var array|**** **** when not set up
     */
    protected static $_censorCache = ****;

    /**
     * Internal value of html encoded variable for auto-linking. Only used
     * to pass to callback.
     *
     * @var boolean
     */
    protected static $_alptHtmlEncoded = true;

    protected static $_htmlReplacementPlaceholders = array();

    /**
     * Private constructor. Use statically.
     */
    private function __construct() {}

    /**
     * Adds spaces to the given string after the given amount of
     * contiguous, non-whitespace characters.
     *
     * @param string $string
     * @param integer $breakLength Number of characters before break; if ****, use option
     *
     * @return string
     */
    public static function wordWrapString($string, $breakLength)
    {
        $breakLength = intval($breakLength);
        if ($breakLength < 1 || $breakLength > strlen($string)) // strlen isn't completely accurate, but this is an optimization
        {
            return $string;
        }

        return preg_replace('#[^\s]{' . $breakLength . '}(?=[^\s])#u', '$0  ', $string);
    }

    /**
     * Helper to allow templates to pass the censor string to self::censorString()
     *
     * @param string $string
     * @param string $censorString
     *
     * @return string
     */
    public static function censorStringTemplateHelper($string, $censorString = ****)
    {
        return self::censorString($string, ****, $censorString);
    }

    /**
     * Censors the given string.
     *
     * @param string $string
     * @param array|**** $words Words to censor. **** to use option value.
     * @param string|**** $censorString String to censor each character with. **** to use option value.
     *
     * @return string
     */
    public static function censorString($string, array $words = ****, $censorString = ****)
    {
        $allowCache = ($words === **** && $censorString === ****); // ok to use cache for default
        $censorCache = ($allowCache ? self::$_censorCache : ****);

        if ($censorCache === ****)
        {
            if ($words === ****)
            {
                $words = XenForo_Application::get('options')->censorWords;
            }

            if (!$words)
            {
                if ($allowCache)
                {
                    self::$_censorCache = array();
                }

                return $string;
            }

            if ($censorString === ****)
            {
                $censorString = XenForo_Application::get('options')->censorCharacter;
            }

            $censorCache = self::buildCensorArray($words, $censorString);

            if ($allowCache)
            {
                self::$_censorCache = $censorCache;
            }
        }

        if ($censorCache)
        {
            $string = preg_replace(array_keys($censorCache), $censorCache, $string);
        }

        return $string;
    }

    public static function stripCensoredText($string, array $words = ****)
    {
        if ($words === ****)
        {
            $words = XenForo_Application::get('options')->censorWords;
        }

        foreach ($words AS $key => &$word)
        {
            if (is_string($key) || !isset($word['word']) || !isset($word['replace']))
            {
                // old format or broken
                continue;
            }

            $word['replace'] = utf8_strlen($word['word']);
        }

        return self::censorString($string, $words, '');
    }

    /**
     * Builds the censorship array.
     *
     * @param array $words List of words (from option format)
     * @param string $censorString String to replace each character with if no replacement map
     *
     * @return array Possible keys: exact, any with key-value search/replace pairs
     */
    public static function buildCensorArray(array $words, $censorString)
    {
        $censorCache = array();

        foreach ($words AS $key => $word)
        {
            if (is_string($key) || !isset($word['regex']) || !isset($word['replace']))
            {
                // old format or broken
                continue;
            }

            $regex = $word['regex'];
            $replace = $word['replace'];

            $censorCache[$regex] = is_int($replace) ? str_repeat($censorString, $replace) : $replace;
        }

        return $censorCache;
    }

    /**
     * Returns a string that is snipped to $maxLength characters at the nearest space,
     * Appends an elipsis if the string is snipped.
     *
     * @param string
     * @param integer Max length of returned string, excluding elipsis
     * @param integer Offset from string start - will add leading elipsis
     * @param string Elipses string (default: '...')
     *
     * @return string
     */
    public static function wholeWordTrim($string, $maxLength, $offset = 0, $elipses = '...')
    {
        //TODO: this may need a handler for language independence and some form of error correction for bbcode

        $elipsesLen = strlen($elipses);

        if ($offset)
        {
            $string = preg_replace('/^\S*\s+/s', '', utf8_substr($string, $offset));
            if ($maxLength > 0)
            {
                $maxLength = max(1, $maxLength - $elipsesLen);
            }
        }

        $strLength = utf8_strlen($string);
        if ($maxLength > 0 && $strLength > $maxLength)
        {
            $maxLength -= $elipsesLen;

            if ($maxLength > 0)
            {
                $string = utf8_substr($string, 0, $maxLength);
                $string = strrev(preg_replace('/^\S*\s+/s', '', strrev($string))) . $elipses;
            }
            else if ($maxLength <= 0)
            {
                // too short with the elipses, can't really display anything
                $string = $elipses;
                $offset = 0;
            }
        }

        if ($offset)
        {
            $string = $elipses . $string;
        }

        return $string;
    }

    public static function moveHtmlToPlaceholders($string)
    {
        self::$_htmlReplacementPlaceholders = array();

        return preg_replace_callback(
            '#<[^>]*>#si',
            array('XenForo_Helper_String', 'htmlPlaceHolderHandlerInternal'),
            $string
        );
    }

    public static function htmlPlaceHolderHandlerInternal(array $match)
    {
        $placeholder = "\x1A" . count(self::$_htmlReplacementPlaceholders) . "\x1A";
        self::$_htmlReplacementPlaceholders[$placeholder] = $match[0];

        return $placeholder;
    }

    public static function restoreHtmlPlaceholders($string)
    {
        $result = strtr($string, self::$_htmlReplacementPlaceholders);
        self::$_htmlReplacementPlaceholders = array();

        return $result;
    }

    public static function removeHtmlPlaceholders($string)
    {
        return preg_replace("#\x1A\\d+\x1A#", '', $string);
    }

    public static function linkTaggedPlainText($string)
    {
        $string = self::moveHtmlToPlaceholders($string);
        $string = preg_replace_callback(
            '#(?<=^|\s|[\](,]|--|@)@\[(\d+):(\'|"|&quot;|)(.*)\\2\]#iU',
            array('self', '_linkTaggedPlainTextCallback'),
            $string
        );
        $string = self::restoreHtmlPlaceholders($string);

        return $string;
    }

    protected static function _linkTaggedPlainTextCallback(array $match)
    {
        $userId = intval($match[1]);
        $username = self::removeHtmlPlaceholders($match[3]);
        $username = htmlspecialchars($username, ENT_QUOTES, 'utf-8', false);

        $link = XenForo_Link::buildPublicLink('full:members', array('user_id' => $userId));

        return '<a href="' . htmlspecialchars($link) . '" class="username" data-user="' . $userId . ', ' . $username . '">'
            . $username . '</a>';
    }

    /**
     * Automatically links URLs/email in the given string of BB code. Output will be original
     * BB code input with [url] or [email] tags inserted where ncessary.
     *
     * @param string $string BB code string
     * @param boolean $autoEmbedIfEnabled Do auto embed of media if enabled in options
     *
     * @return string
     */
    public static function autoLinkBbCode($string, $autoEmbedIfEnabled = true)
    {
        $formatter = XenForo_BbCode_Formatter_Base::create('XenForo_BbCode_Formatter_BbCode_AutoLink', false);
        $formatter->setAutoEmbed($autoEmbedIfEnabled);
        $parser = XenForo_BbCode_Parser::create($formatter);
        return $parser->render($string);
    }

    /**
     * Auto-links URLs in plain text. This text should generally already be HTML
     * escaped, because it can't be done after the linking.
     *
     * @param string $string
     * @param boolean $htmlEncoded Denotes whether the text is already encoded; if false, the URL will be encoded before being put into the link
     *
     * @return string Text with links added
     */
    public static function getLinkClassTarget($url)
    {
        $target = '_blank';
        $class = 'externalLink';
        $type = 'external';
        $schemeMatch = true;

        $urlInfo = @parse_url($url);
        if ($urlInfo)
        {
            if (empty($urlInfo['host']))
            {
                $isInternal = true;
            }
            else
            {
                $host = $urlInfo['host'] . (!empty($urlInfo['port']) ? ":$urlInfo[port]" : '');
                $isInternal = ($host == XenForo_Application::$host && strpos($url, 'proxy.php') === false);

                $scheme = (!empty($urlInfo['scheme']) ? strtolower($urlInfo['scheme']) : 'http');
                $schemeMatch = $scheme == (XenForo_Application::$secure ? 'https' : 'http');
            }

            if ($isInternal)
            {
                $target = '';
                $class = 'internalLink';
                $type = 'internal';
            }
        }

        return array($class, $target, $type, $schemeMatch);
    }

    /**
     * Given a text that appears to be a URL, extracts the components from it,
     * possibly moving characters after the link or adding http://.
     *
     * @param string $url URL that may have trailing characters or missing scheme
     *
     * @return array Keys: url, linkText, suffixText
     */
    public static function prepareAutoLinkedUrl($url)
    {
        $suffixText = '';

        if (preg_match('/&(?:quot|gt|lt);/i', $url, $match, PREG_OFFSET_CAPTURE))
        {
            $suffixText = substr($url, $match[0][1]);
            $url = substr($url, 0, $match[0][1]);
        }

        $linkText = $url;

        if (strpos($url, '://') === false)
        {
            $url = 'http://' . $url;
        }

        do
        {
            $matchedTrailer = false;
            $lastChar = substr($url, -1);
            switch ($lastChar)
            {
                case ')':
                    if (substr_count($url, ')') == substr_count($url, '('))
                    {
                        break;
                    }
                    // break missing intentionally

                case '.':
                case ',':
                case '!':
                case ':':
                case "'":
                    $suffixText = $lastChar . $suffixText;
                    $url = substr($url, 0, -1);
                    $linkText = substr($linkText, 0, -1);

                    $matchedTrailer = true;
                    break;
            }
        }
        while ($matchedTrailer);

        return array(
            'url' => $url,
            'linkText' => $linkText,
            'suffixText' => $suffixText
        );
    }

    /**
     * Strips BB code from a string
     *
     * @param string $string
     * @param boolean $stripQuote If true, contents from within quote tags are stripped
     *
     * @return string
     */
    public static function bbCodeStrip($string, $stripQuote = false)
    {
        /*$formatter = XenForo_BbCode_Formatter_Base::create('XenForo_BbCode_Formatter_BbCode_Strip', false);
        $formatter->setMaxQuoteDepth(0);

        $parser = XenForo_BbCode_Parser::create($formatter);
        return $parser->render($string);*/

        if ($stripQuote)
        {
            $parts = preg_split('#(\[quote[^\]]*\]|\[/quote\])#i', $string, -1, PREG_SPLIT_DELIM_CAPTURE);
            $string = '';
            $quoteLevel = 0;
            foreach ($parts AS $i => $part)
            {
                if ($i % 2 == 0)
                {
                    // always text, only include if not inside quotes
                    if ($quoteLevel == 0)
                    {
                        $string .= rtrim($part) . "\n";
                    }
                }
                else
                {
                    // quote start/end
                    if ($part[1] == '/')
                    {
                        // close tag, down a level if open
                        if ($quoteLevel)
                        {
                            $quoteLevel--;
                        }
                    }
                    else
                    {
                        // up a level
                        $quoteLevel++;
                    }
                }
            }
        }

        // replaces unviewable tags with a text representation
        $string = str_replace('[*]', '', $string);
        $string = preg_replace('#\[(attach|media|img|spoiler)(?![a-z0-9_])[^\]]*\].*\[/\\1\]#siU', "[\x1A\\1]", $string);

        // split the string into possible delimiters and text; even keys (from 0) are strings, odd are delimiters
        $parts = preg_split('#(\[[a-z0-9_]+(?:=[^\]]*)?\]|\[/[a-z0-9_]+\])#si', $string, -1, PREG_SPLIT_DELIM_CAPTURE);
        $total = count($parts);
        if ($total < 2)
        {
            $string = str_replace("\x1A", '', $string);
            return trim($string);
        }

        $closes = array();
        $skips = array();
        $newString = '';

        // first pass: find all the closing tags and note their keys
        for ($i = 1; $i < $total; $i += 2)
        {
            if (preg_match("#^\\[/([a-z0-9_]+)]#i", $parts[$i], $match))
            {
                $closes[strtolower($match[1])][$i] = $i;
            }
        }

        // second pass: look for all the text elements and any opens, then find
        // the first corresponding close that comes after it and remove it.
        // if we find that, don't display the open or that close
        for ($i = 0; $i < $total; $i++)
        {
            $part = $parts[$i];
            if ($i % 2 == 0)
            {
                // string part
                $newString .= $part;
                continue;
            }

            if (!empty($skips[$i]))
            {
                // known close
                continue;
            }

            if (preg_match('/^\[([a-z0-9_]+)(?:=|\])/i', $part, $match))
            {
                $tagName = strtolower($match[1]);
                if (!empty($closes[$tagName]))
                {
                    do
                    {
                        $closeKey = reset($closes[$tagName]);
                        if ($closeKey)
                        {
                            unset($closes[$tagName][$closeKey]);
                        }
                    }
                    while ($closeKey && $closeKey < $i);
                    if ($closeKey)
                    {
                        // found a matching close after this tag
                        $skips[$closeKey] = true;
                        continue;
                    }
                }
            }

            $newString .= $part;
        }

        $newString = str_replace("\x1A", '', $newString);

        return trim($newString);
    }

    /**
     * Creates a snippet of $length maximum characters around a search term.
     * If the term is not found, the snippet is taken from the string start.
     *
     * @param $string
     * @param $maxLength
     * @param $term
     *
     * @return string
     */
    public static function wholeWordTrimAroundSearchTerm($string, $maxLength, $term)
    {
        $stringLength = utf8_strlen($string);

        if ($stringLength > $maxLength)
        {
            $term = strval($term);

            if ($term !== '')
            {
                // TODO: slightly more intelligent search term matching, breaking up multiple words etc.
                $termPosition = utf8_strpos(utf8_strtolower($string), utf8_strtolower($term));
            }
            else
            {
                $termPosition = false;
            }

            if ($termPosition !== false)
            {
                // add term length to term start position
                $startPos = $termPosition + utf8_strlen($term);

                // count back half the max characters
                $startPos -= $maxLength / 2;

                // don't overflow the beginning
                $startPos = max(0, $startPos);

                // don't overflow the end
                $startPos = min($startPos, $stringLength - $maxLength);
            }
            else
            {
                $startPos = 0;
            }

            $string = self::wholeWordTrim($string, $maxLength, $startPos);
        }

        return $string;
    }

    /**
     * Returns an HTML string with instances a search term highlighted with <em class="$emClass">...</em>
     *
     * @param string Haystack
     * @param string Needle
     * @param string Class with which to style the wrapping <em>
     *
     * @return string HTML
     */
    public static function highlightSearchTerm($string, $term, $emClass = 'highlight')
    {
        $term = trim(preg_replace('#((^|\s)[+|-]|[/()"~^])#', ' ', strval($term)));
        if ($term !== '')
        {
            return preg_replace('/(' . preg_replace('#\s+#', '|', preg_quote(htmlspecialchars($term), '/')) . ')/siu', '<em class="' . $emClass . '">\1</em>', htmlspecialchars($string));
        }

        return htmlspecialchars($string);
    }

    /**
     * Strips out quoted text from the specified string, allowing for quoted text
     * up to a specified depth.
     *
     * @param string $string
     * @param integer $allowedDepth -1 for unlimited depth
     * @param boolean $censorResults
     *
     * @return string Quotes stripped
     */
    public static function stripQuotes($string, $allowedDepth = -1, $censorResults = true)
    {
        if ($allowedDepth == -1)
        {
            return $string;
        }
        else
        {
            $formatter = XenForo_BbCode_Formatter_Base::create('XenForo_BbCode_Formatter_BbCode_Strip', false);
            $formatter->setMaxQuoteDepth($allowedDepth);
            $formatter->setCensoring($censorResults);

            $parser = XenForo_BbCode_Parser::create($formatter);
            return $parser->render($string);
        }
    }

    /**
     * Finds simple phrase syntax in a string, e.g. {phrase:phrase_name} and builds an array  of phrase names
     * e.g. ['{phrase:phrase_name}'] => 'phrase_name'
     *
     * The resulting array can then be used to query for the phrase_text of the found phrase names.
     *
     * @param $string
     * @return array
     */
    public static function findPhraseNamesFromStringSimple($string)
    {
        preg_match_all(
            '#\{phrase:([a-z0-9_]+)\}#iU', $string, $matches, PREG_SET_ORDER
        );

        $replacements = array();

        foreach ($matches AS $match)
        {
            $replacements[$match[0]] = $match[1];
        }

        return $replacements;
    }
}

Em đặt Dofollow cũng không hiện
Rồi Dùng DoFollowforUsergroup_1.0.0 Cài Vào Nó Cũng Không Hiện , Em sài Styles Seomxh.com
http://blogger-bitdesigner.rhcloud.com/

Cài DoFollowforUsergroup_1.0.0 nó cũng không hiện Link Dofollow . Cao Nhân Chỉ Giúp
 
  • Like
Reactions: THB

Top Bottom