将RT(转发)和@UserName过滤为tweet中的标签

时间:2012-02-11 01:55:17

标签: php regex

我正在扫描推文,看他们是否转发。转发约定是“RT @UserName”(我假设我们都知道:-)示例:

$tweet = "RT @SeekingAlpha: Best Stock Bargains";

每当我遇到转发时,我都会尝试在推文数据库中找到原始推文:

function _process_retweets($tweet) {
  if (substr($tweet, 0, 2) == "RT") {
    $original = preg_replace("/^RT +@[^ :]+:? */ui", "", $tweet);
    $id_str = false;
    $id_str = db_result(db_query("SELECT id_str FROM tweets WHERE text = '%s'", $original));
    $tag = ($id_str != false) ? '{RT:' . $id_str . '}' : '{RT}';
    return preg_replace("/^RT/ui", $tag, $tweet);
  }
  else {
    return $tweet;
  }
}

返回:

{RT:3423124} @SeekingAlpha: Best Stock Bargains

现在,我遇到了不同的格式,他们没有在推文的开头放置“RT”:

$tweet = "Wow! Look at this - RT @SeekingAlpha: Best Stock Bargains";

现在,我的功能不再起作用了。我会扫描“RT”,但我可能也会看到“我是对的吗?rt?”作为转发指标。所以我必须在推文的任何地方寻找整个约定:“RT @UserName”。执行此操作的最佳方法是什么,以便输出

Wow! Look at this - {RT:4326565} @SeekingAlpha: Best Stock Bargains

1 个答案:

答案 0 :(得分:1)

只需从正则表达式中删除“字符串开头”控制字符:

/^RT +@[^ :]+:? */ui变为/RT +@[^ :]+:?/ui

并使用preg_match在字符串中找到它:

preg_match('/RT +@[^ :]+:?/ui', $tweet, $retweets);
if (count($retweets) > 0)
{
    // we have re-tweets
}

此外,将正则表达式修改为'/RT +@[^ :]+:?(.*)/ui',您可以将推文名称(Best Stock Bargains)捕获到$retweets数组中的元素中。