@Wolfak

Регулярные выражения для создания хештегов в PHP #2?

Доброе время суток. Появилась необходимость в создании хештегов для сайта.
С регулярными выражениями у меня не всегда все гладко, поэтому обратился за помощью в интернете и по примеру сделал вот такие выражения для хештегов и для внешниех ссылок:
$Post_Text = preg_replace("~(http|https|ftp|ftps)://(.*?)(\s|\n|[,.?!](\s|\n)|$)~", '<noindex><nofollow><a href="http://site.ru/link=$2" target="_blank">$2</a></nofollow></noindex>$3', $Post_Text);
$Post_Text = preg_replace("/#([\S]+)/", "<a href=\"http://site.ru/posts&search=\\1\">#\\1</a>", $Post_Text);
$Post_Text = preg_replace("/@([\S]+)/", "<a href=\"http://site.ru/\\1\">@\\1</a>", $Post_Text);

Но у данных выражений есть огромный минус. Если написать такие теги они будут выводиться с ошибкой:
#abs@as
@asfgas#asgasg
@sag@asfas
#asfasf#asgas


Как исправить данные выражения или же какие дописать условия, чтобы таких ошибок не было и все работало?
P.S.
Думаю что нужно сделать какую-нибудь проверку-условие с if, что то типо:
Если есть несколько #@ или ## или @# или @@ то между каждыми из них должен быть пробел, иначе ничего не заменять. Но не могу написать такое условие из-за того что плохо владею регулярками.

и еще один вопрос. Не подскажите из кода выше для редиректа ссылок через шлюз, как сделать чтобы локальные ссылки не заменялись? Спасибо.

Ссылка на старую версию вопроса:
Регулярные выражения для создания хештегов в PHP?

Спасибо за помощь!
  • Вопрос задан
  • 305 просмотров
Пригласить эксперта
Ответы на вопрос 1
Не очень понял что вам надо но:
// Удалить собаку
$tag = preg_replace("/@/ism", "", $tag);
// Удалить собаку если это первый символ
$tag = preg_replace("/^@/ism", "", $tag);
//поставить пробел перед собакой если его нет
$tag = preg_replace("/@/ism", " @", $tag);

UP
$tag = str_replace("@", "@", $tag, $gav);
$tag = str_replace("#", "#", $tag, $re);
if($gav > 0 && $re > 0){
// есть оба тега, один удалить
}
elseif($gav > 1){
// собаки две, одну удалить
}
elseif($re > 1){
// решётки две, одну удалить
}
else{
// всё в порядке, действия по дефолту
}

Ну на самом деле собак или решёток может быть 3,4 или больше и тогда это тоже будет удовлетворять условиям, но удалять надо будет уже не одну, ну это сами подумаете как вам надо
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы