2012-06-26 7 views
2

Я создал функцию PHP, которая автоматически превратит URL-адреса в ссылки, свяжет Twitter @reply имена пользователей в своем профиле Twitter и превратит адреса электронной почты в ссылки на протокол mailto.Функция автоматической ссылки не работает должным образом

Вот сценарий:

function autolink($a, $b){ 
     $e = ""; 
     $f = array(
      'link' => '~(http(s|)\:\/\/(www\.|)((\w+)\.(\w+)(\:[0-9]{2,5}|)\.[a-z]{2,5}|(\w+)(\:[0-9]{2,5}|)\.[a-z]{2,5}))((((\/|)\w+)(\.[a-z]{2,5}|))+)(\?(\w+\=\w+(\&|))+|)~', 
      'email' => '~\w+\@\w+(\:[0-9]{2,5}|)\.[a-z]{2,5}~', 
      'twitter' => '~\@([a-zA-Z_0-9]){1,15}~' 
     ); 
    switch ($b) { 
    case "link":$e = preg_replace_callback($f['link'], function ($a) {return '<a href="'.$a.'" rel="nofollow" target="_blank">'.$a.'</a>';},$a);break; 
    case "email":$e = preg_replace_callback($f['email'], function ($a) {return '<a href="mailto:'.$a.'" rel="nofollow" target="_blank">'.$a.'</a>';},$a);break; 
    case "twitter":$e = preg_replace_callback($f['twitter'], function ($a) {return '<a href="https://twitter.com/#!/'.str_replace('@','',$a).'" rel="nofollow" target="_blank">'.$a.'</a>';},$a);break; 
    } 
    return $e; 
} 

Единственная проблема у меня в том, что вместо того, чтобы вернуться по ссылке возвращает слово: «Array».

Например, это:

autolink("This is my site http://weebuild.biz", "link"); 

возвращается это:

Это мой сайт Массив

Когда следует возвращать:

Это мой сайт <a href="http://weebuild.biz" rel="nofollow" target="_blank">http://weebuild.biz</a>

Оригинальный сценарий был в Javasript, который я написал, а также: http://jsfiddle.net/shawn31313/umgqR/2/

Поскольку я не разработчик PHP версии JavaScript имеет некоторые дополнительные функции.

Возможно, проблема в том, что я принял регулярное выражение из JavaScript и просто поместил его в PHP. Я не уверен, что регулярные выражения на PHP отличаются от JavaScript.

Заранее благодарен.

ответ

3

Попробуйте следующие изменения:

case "link":$e = preg_replace_callback(
     $f['link'], 
     function ($a) { 
      return '<a href="'.$a[0].'" rel="nofollow" target="_blank">'.$a[0].'</a>'; 
     }, 
     $a 
    ); 
    break; 

Вопрос заключается в том, что аргумент функции обратного вызова будет массив, а не строка.

Из docs:

обратного вызова, которая будет вызвана и передается массив соответствующих элементов в предметной строке. Обратный вызов должен вернуть строку замены .

+0

Спасибо, что просто попробуйте изменить все $ a на $ a [0]. Кажется, что это единственное изменение. – Shawn31313

+1

Правильно, просто '$ a' =>' $ a [0] '. Я просто отформатировал ответ, чтобы быть более читаемым. – sberry

2

$a внутри обратного вызова массив и возвращает что-то вроде этого:

Array 
(
    [0] => http://weebuild.biz 
    [1] => http://weebuild.bi 
    [2] => 
    [3] => 
    [4] => weebuild.bi 
    [5] => 
    [6] => 
    [7] => 
    [8] => weebuild 
    [9] => 
    [10] => z 
    [11] => z 
    [12] => z 
    [13] => 
    [14] => 
    [15] => 

)

Вы можете захотеть обратиться к $a[0] вместо просто $a. Конечно, вам нужно сделать некоторые проверки, чтобы убедиться, что это значение и избежать каких-либо неожиданных ошибок при обращении к нему.

+0

О, я вижу. Ну, я не разработчик PHP, поэтому я привык к способу JavaScript, который не возвращает Array. – Shawn31313

Смежные вопросы