Кто может взломать этот твиттер регулярное выражение? - PullRequest
2 голосов
/ 27 марта 2009

Я хотел бы получить все хэштеги с помощью PHP из http://search.twitter.com/search.atom?q=%23eu-jele%C4%A1%C4%A1i

Хэштеги находятся в контенте, заголовочных узлах в ленте RSS. Они имеют префикс #

У меня проблема с неанглийскими буквами (вне диапазона a-zA-Z).

Если вы посмотрите на RSS-канал, а затем просмотрите html-источник, моя борьба может быть более ясной.

    <title>And more: #eu-jele&#289;&#289;i #eu-kiest #ue-wybiera #eu-eleger #ue-alege #eu-vyvolenej #eu-izvoli #eu-elegir #eu-v&#228;lja #eu-elect</title>

Нужно ли что-то сделать с узлом заголовка, прежде чем я найду совпадения с rexexp.

Моя конечная цель - заменить хэштег на URL-адрес поиска в твиттере, например, http://search.twitter.com/search.atom?q=%23eu-jele%C4%A1%C4%A1i

Вот пример кода, который поможет вам в этом.


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

<body>
<?php 
$title="And more: #eu-jele&#289;&#289;i #eu-kiest #ue-wybiera #eu-eleger #ue-alege #eu-vyvolenej #eu-izvoli #eu-elegir #eu-v&#228;lja #eu-elect";

// this is the regexp that hashtags.org use (http://twitter.pbwiki.com/Hashtags)
$r = preg_replace("/(?:(?:^#|[\s\(\[]#(?!\d\s))(\w+(?:[_\-\.\+\/]\w+)*)+)/"," <a href=\"http://search.twitter.com/search?q=%23\1\">\1</a> ", $title);
echo "<p>$r</p>";

$r = preg_replace("/(#.+?)(?:(\s|$))/"," <a href=\"http://search.twitter.com/search?q=\1\">\1</a> ", $title);
echo "<p>$r</p>";

// This is my desired end result
echo "<p><a href=\"http://search.twitter.com/search?q=%23eu-jeleġġi\">#eu-jeleġġi</a></p>";
?>

</body>
</html>

Любой совет или решение будет принята с благодарностью.

Ответы [ 5 ]

9 голосов
/ 27 марта 2009

Или просто

(#\S+)
3 голосов
/ 24 апреля 2011

Если вам нужно точное регулярное выражение, которое Twitter использует для рендеринга хештегов, оно предоставляет его вместе с шаблонами для ссылок, упоминаний и т. Д. В этой библиотеке с открытым исходным кодом .

Шаблон совпадения хэштега

(^|[^0-9A-Z&/]+)(#|\uFF03)([0-9A-Z_]*[A-Z_]+[a-z0-9_\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u00ff]*)

Вышеприведенный шаблон можно соединить из этого Java-файла. Валидационные тесты для этого шаблона находятся в этом файле вокруг строки 115.

1 голос
/ 09 мая 2009

вот что я бы использовал:)

(?<![^\s#])(#[^\s#]+)(?=(\s|$))

пример соответствия по этой строке

# test # test # test # test-test test # test

надеюсь, что это полезно

1 голос
/ 27 марта 2009

Захватите «#» плюс все символы, пока вы не нажмете пробел:

(#.+?)(?:\s)

Или немного более гибкий (допускает конец строки):

(#.+?)(?:(\s|$))
0 голосов
/ 27 марта 2009

Почему вы используете регулярное выражение? Удалите все, что не предшествует хешу, затем взорвите хешем. Регулярное выражение кажется излишне сложным и плохо приспособленным к этой проблеме.

Возможно, вы сможете объяснить, почему это нужно сделать в регулярном выражении?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...