Синтаксический анализ хэштегов в Twitter API PHP


Я хочу проанализировать хэштеги из твитов, которые я получаю из twitter. Теперь я не нашел ничего доступного в api. Итак, я разбираю его самостоятельно, используя php. Я пробовал несколько вещей.

<?php
$subject = "This is a simple #hashtag";
$pattern = "#\S*\w";
preg_match_all($pattern, $subject, $matches, PREG_OFFSET_CAPTURE);
print_r($matches);
?>

Я тоже пробовал

$pattern = "/[#]"."[A-Za-z0-9-_]"."/g";

Но затем он показывает, что /g не распознается php. Я уже довольно давно пытаюсь это сделать, но у меня не получается. Поэтому, пожалуйста, помогите.

P.S.: У меня очень слабое представление о регулярных экспериментах.

Author: Shivam Mangla, 2013-03-22

3 answers

Вам нужно подумать, где может появиться хэштег. Есть три случая:

  • в начале твита,
  • после пробела,
  • в середине слова - это не должно считаться хэштегом.

Так что это будет соответствовать им правильно:

'/(^|\s)\#\w+/'

Объяснение:

  • ^ может использоваться в ИЛИ операторах
  • \s используется для захвата пробелов, вкладок и новых строк

Вот полный код:

<?php
$subject = "#hashtag This is a simple #hashtag hello world #hastag2 last string not-a-hash-tag#hashtag3 and yet not -#hashtag";
$pattern = "/(?:^|\s)(\#\w+)/";
preg_match_all($pattern, $subject, $matches, PREG_OFFSET_CAPTURE);
print_r($matches);
?>
 1
Author: Haralan Dobrev, 2013-03-22 19:54:24

Это работает для меня:

$subject = "This is a simple #hashtag hello world #hastag2 last string #hashtag3";
$pattern = "/(#\w+)/";
preg_match_all($pattern, $subject, $matches, PREG_OFFSET_CAPTURE);
print_r($matches);
 0
Author: Samuel Cook, 2013-03-22 19:33:24

Есть более простой способ использовать прототипы объектов, написал пост с подробным описанием того, как это сделать не только с помощью хэштегов, но и имен пользователей и URL-адресов в твитах. Это было необходимо для проекта, над которым я работаю, где я получаю твиты из API Twitter.

Https://benmarshall.me/parse-twitter-hashtags/

Вот соответствующий код:

// Auto-link URLs in a string
// Usage: mystring.parseURL()
String.prototype.parseURL = function() {
  return this.replace(/[A-Za-z]+:\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_:%&~\?\/.=]+/g, function( url ) {
    return url.link( url );
  });
};

// Auto-link Twitter usernames in a string
// Usage: mystring.parseUsername()
String.prototype.parseUsername = function() {
  return this.replace(/[@]+[A-Za-z0-9-_]+/g, function( u ) {
    var username = u.replace("@","");

    return u.link( 'http://twitter.com/' + username );
  });
};

// Auto-link Twitter hashtags in a string
// Usage: mystring.parseHashtag()
String.prototype.parseHashtag = function() {
  return this.replace(/[#]+[A-Za-z0-9-_]+/g, function( t ) {
    var tag = t.replace("#","%23");

    return t.link( 'http://search.twitter.com/search?q=' + tag );
  });
};
 0
Author: Ben Marshall, 2018-09-10 15:19:55