У меня есть функция php, которая возвращает сообщение Facebook как текст. Тем не менее, я хочу, чтобы все # -hashtags были доступны для просмотра и ссылались на http://www.facebook/hashtags/ {the -hhhtag}. Я попытался сделать это со следующим preg_replace, но, видимо, я делаю что-то неправильно:
$postMessage = preg_replace('/#[^(\s|\p{P})]*', '<a href="https://www.facebook.com/hashtag/$1" title="$1"></a>', $postMessage);
Это выводит ссылки, где ожидалось, поэтому регулярное выражение кажется правильным, но вывод выглядит следующим образом:
<a href="https://www.facebook.com/hashtag/" title=""></a>
Поэтому я уверен, что я делаю что-то неправильно с обратной ссылкой, но я не совсем уверен, что.
(Боковой вопрос, global
параметр не нужен в preg_replace? Я привык использовать его в JS.)
Пример $postMessage
:
Android Wear testen doen we met de Sony #Smartwatch3. Binnenkort volgt een uitgebreide review op de website ;-)
Выход должен быть:
Android Wear testen doen we met de Sony <a href="https://www.facebook.com/hashtag/smartwatch3" title="Smartwatch3">#Smartwatch3</a>. Binnenkort volgt een uitgebreide review op de website ;-)
Regex:
#([^\p{P}\s]*)
[^\p{P}\s]*
соответствует любому символу, но не пунктуации или пробелы, ноль или более раз.
Заменяемая строка:
<a href="https://www.facebook.com/hashtag/$1" title="$1">#$1</a>
PHP-код был бы,
$re = "/#([^\\p{P}\\s]*)/m";
$str = "Android Wear testen doen we met de Sony #Smartwatch3. Binnenkort volgt een uitgebreide review op de website ;-)\n\n";
$subst = "<a href=\"https://www.facebook.com/hashtag/$1\" title=\"$1\">#$1</a>";
$result = preg_replace($re, $subst, $str);
#
из обратной ссылки. Т.е. фактический результат должен быть следующим: <a href="https://www.facebook.com/hashtag/{MATCH-without-#}" title="{MATCH-without-#}">{MATCH}</a>
#([^\s\p{P}]*)\S+
Просто сгруппируйте его регулярное выражение. Он работает. Смотрите демоверсию.
'~(#[^\s]*\s)~
и вам не нужно добавлять модификаторg
.$postMessage
?