Как мне связать имена пользователей Twitter с помощью PHP preg replace?


Я хочу выполнить поиск в свойстве text объектов моего статуса в Twitter и заменить @username на <a href="http:/twitter.com/username">@username</a>. То, что я пробовал до сих пор, выглядит так:

$pattern = '/([@]{1})([a-zA-Z0-9\_]+)/';
$replace = '<a href="http://twitter.com/\2">\1\2</a>';
$new_string = preg_replace($pattern, $replace, $text);

Но он не производит никаких замен. Я знаю, что мой reg exp неверен, но я не могу точно понять, где/почему. Помочь?

**Изменить: ...образец данных, как было запрошено?

$text = '@janesmith I like that, but my friend @johndoe said it better.';

Желаемый результат:

@ джейнсмит Мне это нравится, но мой друг @johndoe сказал это лучше.

***** MY FULL FUNCTION *****

function linkify($string, $twitter=false) {

    // reg exp pattern
    $pattern = "/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/";

    // convert string URLs to active links
    $new_string = preg_replace($pattern, "<a href=\"\\0\">\\0</a>", $string);

    if ($twitter) {
        $pattern = '/@([a-zA-Z0-9_]+)/';
        $replace = '<a href="http://twitter.com/\1">@\1</a>';
        $new_string = preg_replace($pattern, $replace, $new_string);
    }

    return $new_string;
}
Author: rhodesjason, 2010-10-28

4 answers

Почему \ там перед _? Сработает ли это, если вы уберете \? Хотя это не должно было нарушать функциональность...

Может быть полезно изменить \1 на \\1, чтобы вы были уверены, что обратная косая черта экранирована; или лучше (начиная с PHP 4.0.4) $1. Но опять же, это должно было работать как есть, в одинарных кавычках.

Кроме того, вы можете упростить:

$pattern = '/@([a-zA-Z0-9_]+)/';
$replace = '<a href="http://twitter.com/$1">@$1</a>';
 5
Author: LarsH, 2010-10-28 15:57:07

Я также немного обновил функцию поддержки хэштегов:

Функция linkify($строка, $twitter=ложь) {

//шаблон reg exp

$шаблон = "/(http|https|ftp|ftps)\:\/\/[a-za-Z0-9-.]+.[a-za-Z]{2,3}(\/\S*)?/";

//преобразование строковых URL-адресов в активные ссылки $new_string =preg_replace($шаблон, "\0", $строка);

Если ($twitter) {

   $pattern = '/\@([a-zA-Z0-9_]+)/';

   $replace = '<a href="http://twitter.com/\1">@\1</a>';

   $new_string = preg_replace($pattern, $replace, $new_string);


   $pattern = '/\#([a-zA-Z0-9_]+)/';

   $replace = '<a href="http://twitter.com/search/#\1">#\1</a>';

   $new_string = preg_replace($pattern, $replace, $new_string);

}

Возвращает $новую строку; }

 2
Author: Akas84, 2011-02-18 12:42:04

Обнаружил, что это работает для URL-адресов, @имен пользователей и #хэштегов:

Http://davidwalsh.name/linkify-twitter-feed

 0
Author: Refiner, 2012-08-23 20:36:40

Twitter обновил свой api, и, по крайней мере для меня, он стал более удобным для пользователя. Ознакомьтесь с документацией, найденной на dev.twitter.com/docs/twitter-for-websites нажмите здесь . Сначала вы должны создать приложение, следовать пошаговым инструкциям, а затем создать виджет. Виджет, который вы видите ниже, отображает мои твиты, но вы можете создать виджет, который отображает все действия на вашей временной шкале или результаты поиска, списки и т.д...

     <a class="twitter-timeline" ref="https://twitter.com/SKAmerica" data-widget-id="359949405157203970">Tweets by @SKAmerica</a>
     <script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id))js=d.createElement(s);js.id=id;js.src=p+"://platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script>
 0
Author: Steve Kinzey, 2013-07-24 08:22:59