Skip to content
Derek Jones edited this page Jul 5, 2012 · 3 revisions

I decided I needed to have html attributes for my anchors generated by the auto_link helper so I did a quick extension. Didn't notice anyone else had posted it, so I thought I'd share. Perhaps this is too trivial for the wiki...but maybe this will help someone.

btw - of course this extension goes in ./application/helpers/MY_url_helper.php

/**
 * Modifies the auto_link helper (url_helper) by accepting as an optional third
 * argument an array of html attributes for the anchor tags (just like the anchor helper).
 *
 * This array is supplied as the third argument, replacing the
 * optional argument $pop in the original helper.
 * 
 * This modified helper attempts to be backward compatible with the use of the 
 * original helper by accepting TRUE and FALSE as possible values for the $attributes
 * argument, and giving output identical to the original usage of the helper.
 *
 * use:  auto_link($string, 'url' , array('class' => 'external', 'target'=>'_blank'));
 * use:  auto_link($string, 'email', array('class' => 'email_link' , 'style' => 'color:red;'));
 * use(legacy): auto_link($string, 'url' , TRUE);
 *
 * @see url_helper
 * @link http://codeigniter.com/user_guide/helpers/url_helper.html
 * @param string $str
 * @param string $type 
 * @param mixed $attributes 
 * @return string
 */
function auto_link($str, $type = 'both', $attributes = '')
    {
            // MAKE THE THIRD ARGUMENT BACKWARD COMPATIBLE
            // here we deal with the original third argument $pop
            // which could be TRUE or FALSE, and was FALSE by default.
            $pop = '';
            if ($attributes === TRUE)
            {
                $pop = ' target="_blank" ';
                $attributes = '';
            }
            elseif ($attributes === FALSE)
            {
                $pop = $attributes = '';
            }




        if ($type != 'email')
        {

            if (preg_match_all("#(^|\s|\()((http(s?)://)|(www\.))(\w+[^\s\)\<]+)#i", $str, $matches))
            {
                                
                                if( $attributes != '' )
                                {
                                        $attributes = _parse_attributes($attributes);
                                }
                               

                for ($i = 0; $i < count($matches['0']); $i++)
                {
                    $period = '';
                    if (preg_match("|\.$|", $matches['6'][$i]))
                    {
                        $period = '.';
                        $matches['6'][$i] = substr($matches['6'][$i], 0, -1);
                    }





                    $str = str_replace($matches['0'][$i],
                                        $matches['1'][$i].'<a  href="http'.
                                        $matches['4'][$i].'://'.
                                        $matches['5'][$i].
                                        $matches['6'][$i].'">http'.
                                        $matches['4'][$i].'://'.
                                        $matches['5'][$i].
                                        $matches['6'][$i].'</a>'.
                                        $period, $str);
                }
            }
        }

        if ($type != 'url')
        {
            if (preg_match_all("/([a-zA-Z0-9_\.\-\+]+)@([a-zA-Z0-9\-]+)\.([a-zA-Z0-9\-\.]*)/i", $str, $matches))
            {
                for ($i = 0; $i < count($matches['0']); $i++)
                {
                    $period = '';
                    if (preg_match("|\.$|", $matches['3'][$i]))
                    {
                        $period = '.';
                        $matches['3'][$i] = substr($matches['3'][$i], 0, -1);
                    }

                    $str = str_replace($matches['0'][$i], safe_mailto($matches['1'][$i].'@'.$matches['2'][$i].'.'.$matches['3'][$i]).$period, $str,$attributes);
                }
            }
        }

        return $str;
    }//END
Clone this wiki locally