protected function linkify($text, $urls = true, $emails = true, array $options = array())
    {
        if (false === $urls && false === $emails) {
            // nothing to do...
            return $text;
        }

        $options = array_merge_recursive($this->options, $options);

        $attr = '';

        if (true === array_key_exists('attr', $options)) {
            foreach ($options['attr'] as $key => $value) {
                if (true === is_array($value)) {
                    $value = array_pop($value);
                }
                $attr .= sprintf(' %s="%s"', $key, $value);
            }
        }

        $options['attr'] = $attr;

        $ignoreTags = array('head', 'link', 'a', 'script', 'style', 'code', 'pre', 'select', 'textarea', 'button');

        $chunks = preg_split('/(<.+?>)/is', $text, 0, PREG_SPLIT_DELIM_CAPTURE);

        $openTag = null;

        for ($i = 0; $i < count($chunks); $i++) {
            if ($i % 2 === 0) { // even numbers are text
                // Only process this chunk if there are no unclosed $ignoreTags
                if (null === $openTag) {
                    if (true === $urls) {
                        $chunks[$i] = $this->linkifyUrls($chunks[$i], $options);
                    }
                    if (true === $emails) {
                        $chunks[$i] = $this->linkifyEmails($chunks[$i], $options);
                    }
                }
            } else { // odd numbers are tags
                // Only process this tag if there are no unclosed $ignoreTags
                if (null === $openTag) {
                    // Check whether this tag is contained in $ignoreTags and is not self-closing
                    if (preg_match("`<(" . implode('|', $ignoreTags) . ").*(?<!/)>$`is", $chunks[$i], $matches)) {
                        $openTag = $matches[1];
                    }
                } else {
                    // Otherwise, check whether this is the closing tag for $openTag.
                    if (preg_match('`</\s*' . $openTag . '>`i', $chunks[$i], $matches)) {
                        $openTag = null;
                    }
                }
            }
        }

        $text = implode($chunks);

        return $text;
    }
protected function linkify($text, $urls = true, $emails = true, array $options = array())
    {
        if (false === $urls && false === $emails) {
            // nothing to do...
            return $text;
        }

        $options = array_merge_recursive($this->options, $options);

        $attr = '';

        if (true === array_key_exists('attr', $options)) {
            foreach ($options['attr'] as $key => $value) {
                if (true === is_array($value)) {
                    $value = array_pop($value);
                }
                $attr .= sprintf(' %s="%s"', $key, $value);
            }
        }

        $options['attr'] = $attr;

        $ignoreTags = array('head', 'link', 'a', 'script', 'style', 'code', 'pre', 'select', 'textarea', 'button');

        $chunks = preg_split('/(<.+?>)/is', $text, 0, PREG_SPLIT_DELIM_CAPTURE);

        $openTag = null;

        for ($i = 0; $i < count($chunks); $i++) {
            if ($i % 2 === 0) { // even numbers are text
                // Only process this chunk if there are no unclosed $ignoreTags
                if (null === $openTag) {
                    if (true === $urls) {
                        $chunks[$i] = $this->linkifyUrls($chunks[$i], $options);
                    }
                    if (true === $emails) {
                        $chunks[$i] = $this->linkifyEmails($chunks[$i], $options);
                    }
                }
            } else { // odd numbers are tags
                // Only process this tag if there are no unclosed $ignoreTags
                if (null === $openTag) {
                    // Check whether this tag is contained in $ignoreTags and is not self-closing
                    if (preg_match("`<(" . implode('|', $ignoreTags) . ").*(?<!/)>$`is", $chunks[$i], $matches)) {
                        $openTag = $matches[1];
                    }
                } else {
                    // Otherwise, check whether this is the closing tag for $openTag.
                    if (preg_match('`</\s*' . $openTag . '>`i', $chunks[$i], $matches)) {
                        $openTag = null;
                    }
                }
            }
        }

        $text = implode($chunks);

        return $text;
    }
protected function linkify ( $ text , $ urls = true , $ emails = true , array $ options = array ( ) ) { if ( false === $ urls && false === $ emails ) { // nothing to do... return $ text ; } $ options = array_merge_recursive ( $ this -> options , $ options ) ; $ attr = '' ; if ( true === array_key_exists ( 'attr' , $ options ) ) { foreach ( $ options [ 'attr' ] as $ key => $ value ) { if ( true === is_array ( $ value ) ) { $ value = array_pop ( $ value ) ; } $ attr .= sprintf ( ' %s="%s"' , $ key , $ value ) ; } } $ options [ 'attr' ] = $ attr ; $ ignoreTags = array ( 'head' , 'link' , 'a' , 'script' , 'style' , 'code' , 'pre' , 'select' , 'textarea' , 'button' ) ; $ chunks = preg_split ( '/(<.+?>)/is' , $ text , 0 , PREG_SPLIT_DELIM_CAPTURE ) ; $ openTag = null ; for ( $ i = 0 ; $ i < count ( $ chunks ) ; $ i ++ ) { if ( $ i % 2 === 0 ) { // even numbers are text // Only process this chunk if there are no unclosed $ignoreTags if ( null === $ openTag ) { if ( true === $ urls ) { $ chunks [ $ i ] = $ this -> linkifyUrls ( $ chunks [ $ i ] , $ options ) ; } if ( true === $ emails ) { $ chunks [ $ i ] = $ this -> linkifyEmails ( $ chunks [ $ i ] , $ options ) ; } } } else { // odd numbers are tags // Only process this tag if there are no unclosed $ignoreTags if ( null === $ openTag ) { // Check whether this tag is contained in $ignoreTags and is not self-closing if ( preg_match ( "`<(" . implode ( '|' , $ ignoreTags ) . ").*(?<!/)>$`is" , $ chunks [ $ i ] , $ matches ) ) { $ openTag = $ matches [ 1 ] ; } } else { // Otherwise, check whether this is the closing tag for $openTag. if ( preg_match ( '`</\s*' . $ openTag . '>`i' , $ chunks [ $ i ] , $ matches ) ) { $ openTag = null ; } } } } $ text = implode ( $ chunks ) ; return $ text ; }
Add links to text.

@param string $text    Text to linkify.
@param bool   $urls    Linkify URLs?
@param bool   $emails  Linkify email addresses?
@param array  $options Options.

@return string Linkified text.
Add links to text .