Regex для условно заменить Twitter Hashtags с гиперссылками

StackOverflow https://stackoverflow.com/questions/4277070

  •  28-09-2019
  •  | 
  •  

Вопрос

Я пишу небольшой PHP-скрипт, чтобы получить последнюю половину десятка обновлений статуса Twitter из подачи пользователя и отформатировать их для отображения на веб-странице. В рамках этого мне нужно регулировать Regex, чтобы переписать хэштеги как гиперссылки для поиска.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 нет. После того, как немного проверки в Интернете и играют с различными тегами, я пришел к выводу, что хэштег должен содержать алфавитные символы или подчеркивание в нем где-то, чтобы составлять ссылку; Теги с только цифрами игнорируются только числовые символы (предположительно, чтобы остановить такие вещи, как «Хорошая презентация Bob, скользящая # 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;
?>

Оно работает; Но это кажется довольно давно завезенным за то, что он делает. Мой вопрос, есть ли один veg_replace, похожий на тот, который я получил от Gist.github, который условно переписывает хэштеги в гиперссылки только в том случае, если они не содержат только чисел?

Это было полезно?

Решение

(^|\s)#(\w*[a-zA-Z_]+\w*)

Выступ

$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

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

(^|\s)

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top