Skip to content

Instantly share code, notes, and snippets.

@maximal
Last active October 14, 2017 22:34
Show Gist options
  • Save maximal/50e0005d1d70a15a7754 to your computer and use it in GitHub Desktop.
Save maximal/50e0005d1d70a15a7754 to your computer and use it in GitHub Desktop.
RegEx for hashtags
<?php
/**
* Регвыр для хештегов:
* /(?<=\p{Z}|\s|^)#([\p{L}\p{M}\p{N}_]+)/ui
*
* Сначала небуквенный символ (отсекаем решётку в середине слов/ссылок).
* Потом решётка,
* потом непустая последовательность из букв, цифр и модификаторов (ударения, умляуты, прочая хуета).
*
* При этом первый символ (разделитель или начало строки) не включаем в вывод — (?<=
*
* Разумеется, работает с юникодом (кто не работает с Юникодом, тот мудак)
* и всякими значками ударений и умляутами в тексте (как Твиттер).
*
* @author MaximAL
* @since 2015-06-29
* @link http://maximals.ru/notes/2015/04/25/programming-rules-unicode/
* @link http://php.net/manual/en/regexp.reference.unicode.php
*/
mb_internal_encoding('UTF-8');
$matches = null;
preg_match_all('/(?<=\p{Z}|\s|^)#([\p{L}\p{M}\p{N}_]+)/ui', 'теги #тег #тег32. #те́г http://link.com#tag', $matches);
var_dump($matches);
preg_match_all('/(?<=\p{Z}|\s|^)#([\p{L}\p{M}\p{N}_]+)/ui', '#тег #учебный_процесс #disallow-me #allow_me, #тег$ #те́г http://link.com#tag #тег', $matches);
var_dump($matches);
echo PHP_EOL;
@maximal
Copy link
Author

maximal commented Jul 29, 2015

Поехали!

(?<=\p{Z}|\s|^)
это символ, который стоит перед решёткой.
в идеале он — либо начало строки — ^ (никакого символа)
либо пустой символ (пробел, табы, вся хуйня) — \s
либо любой другой разделитель в Юникоде (китайская точка или запятая, например) — \p{Z}
всё это со знаком ИЛИ — |
конструкция (?<= … … …) говорит, что этот сматченный символ мы в выходной результат не заносим, просто отмечаем

дальше

— символ решётки (сюрприз)

дальше выбор, любой из символов — [ … … ]
строка длиной больше одного — +
выбор такой
\p{L} — юникодовые буквы
\p{M} — юникодовые всякие значки, что могут быть в словах
\p{N} — юникодовые цифры
_ — подчёркивание

Во всяких тестах это будет заменено примерно таким:
[\w_] — но это обучалка, к реальной жизни не имеет отношения.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment