7
public function make_url_clickable_cb($matches) {
$ret = '';
$url = $matches[2];

if ( empty($url) )
    return $matches[0];
// removed trailing [.,;:] from URL
if ( in_array(substr($url, -1), array('.', ',', ';', ':')) === true ) {
    $ret = substr($url, -1);
    $url = substr($url, 0, strlen($url)-1);
}
return $matches[1] . "<a href=\"$url\" rel=\"nofollow\">" . $this->truncate($url, 35, '...'). "</a>" . $ret;
}

public function make_web_ftp_clickable_cb($matches) {
    $ret = '';
    $dest = $matches[2];
    $dest = 'http://' . $dest;

    if ( empty($dest) )
        return $matches[0];
    // removed trailing [,;:] from URL
    if ( in_array(substr($dest, -1), array('.', ',', ';', ':')) === true ) {
        $ret = substr($dest, -1);
        $dest = substr($dest, 0, strlen($dest)-1);
    }
    return $matches[1] . "<a href=\"$dest\" rel=\"nofollow\">$dest</a>" . $ret;
}

public function make_email_clickable_cb($matches) {
    $email = $matches[2] . '@' . $matches[3];
    return $matches[1] . "<a href=\"mailto:$email\">$email</a>";
}
public function make_clickable($ret) {
    $ret = ' ' . $ret;
    // in testing, using arrays here was found to be faster
    $ret = preg_replace_callback('#([\s>])([\w]+?://[\w\\x80-\\xff\#$%&~/.\-;:=,?@\[\]+]*)#is', 'Main::make_url_clickable_cb', $ret);
    $ret = preg_replace_callback('#([\s>])((www|ftp)\.[\w\\x80-\\xff\#$%&~/.\-;:=,?@\[\]+]*)#is', 'Main::make_web_ftp_clickable_cb', $ret);
    $ret = preg_replace_callback('#([\s>])([.0-9a-z_+-]+)@(([0-9a-z-]+\.)+[0-9a-z]{2,})#i', 'Main::make_email_clickable_cb', $ret);

    // this one is not in an array because we need it to run last, for cleanup of accidental links within links
    $ret = preg_replace("#(<a( [^>]+?>|>))<a [^>]+?>([^>]+?)</a></a>#i", "$1$3</a>", $ret);
    $ret = trim($ret);
    return $ret;
}

Why won't this work? I get these errors:

Warning: preg_replace_callback() [function.preg-replace-callback]: Requires argument 2, 'Main::make_url_clickable_cb', to be a valid callback in line 134

Warning: preg_replace_callback() [function.preg-replace-callback]: Requires argument 2, 'Main::make_web_ftp_clickable_cb', to be a valid callback in line 135

Warning: preg_replace_callback() [function.preg-replace-callback]: Requires argument 2, 'Main::make_email_clickable_cb', to be a valid callback in line 136

Charles Denault
  • 71
  • 1
  • 1
  • 2
  • 1
    When you post source code, **do not hide the fact that functions are defined inside a class**. This is vital information and (as you can see by comparing my answer with that of Pascal MARTIN), makes the difference between an answer that solves your problem and one that does not. – Oswald Apr 03 '11 at 14:24

4 Answers4

12

If you pass a single string as callback, PHP will interpret it as a function's name -- and Main::make_web_ftp_clickable_cb is not a valid function name;


If you want to specify a static method of a class as callback, you must use :

array('Main', 'make_web_ftp_clickable_cb')

And, if you want to specify a method of an object, instance of a class, you'll have to use :

array($object, 'make_web_ftp_clickable_cb')


Here is the relevant section of the manual : Pseudo-types and variables used in this documentation - callback

Pascal MARTIN
  • 395,085
  • 80
  • 655
  • 663
3

You need to specify your functions as static functions, and use the following as callback function:

array(get_class($this), 'make_url_clickable_cb')

array(get_class($this), 'make_web_ftp_clickable_cb')

array(get_class($this), 'make_email_clickable_cb')

or (if calling from another calss):

array('class_name', 'make_url_clickable_cb')

array('class_name', 'make_web_ftp_clickable_cb')

array('class_name', 'make_email_clickable_cb')
Mohammad Anini
  • 5,073
  • 4
  • 35
  • 46
0

You get these errors, because Main::make_url_clickable_cb, Main::make_web_ftp_clickable_cb and Main::make_email_clickable_cb are not valid callbacks for preg_replace_callback.

Hint: leave out the Main:: part when specifying the callback.

Oswald
  • 31,254
  • 3
  • 43
  • 68
-3

I found my solution at: preg_replace_callback