Regex для условной замены хэштегов Twitter гиперссылками - PullRequest
9 голосов
/ 25 ноября 2010

Я пишу небольшой скрипт PHP, чтобы получить последние полдюжины обновлений статуса Twitter из пользовательского канала и отформатировать их для отображения на веб-странице. В рамках этого мне нужно заменить регулярное выражение, чтобы переписать хэштеги в виде гиперссылок на search.twitter.com. Изначально я пытался использовать:

<?php
$strTweet = preg_replace('/(^|\s)#(\w+)/', '\1#<a href="http://search.twitter.com/search?q=%23\2">\2</a>', $strTweet);
?>

(взято из https://gist.github.com/445729)

В ходе тестирования я обнаружил, что #test преобразуется в ссылку на веб-сайте Twitter, а # 123 - нет. После небольшой проверки в интернете и игры с различными тегами я пришел к выводу, что хэштег должен содержать алфавитные символы или подчеркивание где-то, чтобы образовать ссылку; теги с только числовыми символами игнорируются (по-видимому, чтобы помешать ссылкам типа «Хорошая презентация, Боб, слайд № 3 был моим любимым!»). Это делает приведенный выше код некорректным, так как он с радостью преобразует # 123 в ссылку.

Я давно не делал много регулярных выражений, поэтому из-за своей ржавчины я нашел следующее решение PHP:

<?php
$test = 'This is a test tweet to see if #123 and #4 are not encoded but #test, #l33t and #8oo8s are.';

// Get all hashtags out into an array
if (preg_match_all('/(^|\s)(#\w+)/', $test, $arrHashtags) > 0) {
  foreach ($arrHashtags[2] as $strHashtag) {
    // Check each tag to see if there are letters or an underscore in there somewhere
    if (preg_match('/#\d*[a-z_]+/i', $strHashtag)) {
      $test = str_replace($strHashtag, '<a href="http://search.twitter.com/search?q=%23'.substr($strHashtag, 1).'">'.$strHashtag.'</a>', $test);
    }
  }
}

echo $test;
?>

Работает; но это кажется довольно скучным из-за того, что он делает. Мой вопрос заключается в том, существует ли одно preg_replace, подобное тому, которое я получил от gist.github, которое будет условно переписывать хэштеги ТОЛЬКО в гиперссылки, если они НЕ содержат только цифры?

Ответы [ 4 ]

23 голосов
/ 25 ноября 2010
(^|\s)#(\w*[a-zA-Z_]+\w*)

PHP

$strTweet = preg_replace('/(^|\s)#(\w*[a-zA-Z_]+\w*)/', '\1#<a href="http://twitter.com/search?q=%23\2">\2</a>', $strTweet);

В этом регулярном выражении говорится #, за которым следуют 0 или более символов [a-zA-Z0-9_], за которыми следует буквенный символ или подчеркивание (1 или более), за которыми следуют 0 или более словосочетаний.

http://rubular.com/r/opNX6qC4sG <- проверьте здесь. </p>

1 голос
/ 31 мая 2011

На самом деле лучше искать символы, которые не разрешены в хэштеге, иначе теги типа "# Trentemøller" не сработают.

Следующее хорошо работает для меня ...

preg_match('/([ ,.]+)/', $string, $matches);
0 голосов
/ 12 сентября 2013

Я нашел, что Gazlers ответ работает, хотя регулярное выражение добавило пробел в начале хэштега, поэтому я удалил первую часть:

(^|\s)

Это прекрасно работает дляя сейчас:

#(\w*[a-zA-Z_0-9]+\w*)

Пример здесь: http://rubular.com/r/dS2QYZP45n

0 голосов
/ 25 ноября 2010

Я разработал это: /(^|\s)#([[:alnum:]])+/gi

...