Regex условно заменит хэштеги Twitter гиперссылками

Я пишу небольшой 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, который будет условно переписывать хэштеги в гиперссылки ТОЛЬКО, если они НЕ содержат только числа?

 (^|\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 <- проверьте его здесь.

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

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

 preg_match('/([ ,.]+)/', $string, $matches); 

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

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

 (^|\s) 

Это отлично работает для меня сейчас:

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

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