Помощь с системой тегов @

biohazardmonkey

Пользователь
Регистрация
01.01.70
Сообщения
3
Реакции
0
Баллы
1
привет,

Мне было интересно, не могли бы вы помочь мне с моим уроком по тегам @. Я наполовину построил, но это какой-то хлам. Сейчас он делает половину работы. Он создаст ссылки вокруг пользователей, находящихся в БД, но неправильно.
Помощь с системой тегов @
Если я напишу «Привет, как дела @JeremyBenson11?» Он отлично пометит имя.

Если перед неизвестным именем стоит имя, оно ничего не пометит.

Наверное, есть несколько серьезных конструктивных недостатков, лол.

Проблемная функция


Код:
<?php
class pTagging{ private $db = array(); public function db_set($dbSet) { $this->db['dsn'] = $dbSet['dsn']; $this->db['username'] = $dbSet['username']; $this->db['password'] = $dbSet['password']; } public function handle_user_link($str){ if( preg_match_all("/(@\w+)/", $str, $matches)){ $matches = array_slice($matches, 0, 1); foreach($matches[0] as $tag) { $name = ltrim($tag, '@'); try{ $db = new PDO($this->db['dsn'], $this->db['username'], $this->db['password'], array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); }catch(\PDOException $e){} $sqlName = $db->prepare("SELECT `username` FROM `users` WHERE `username` = ?"); $sqlName->execute(array($name)); $retrievedUser = $sqlName->fetch(); if(!empty($retrievedUser)) { $str = str_replace($tag, '<a href="profile.php?username='.$name.'">' . $tag . '</a>' , $str); } } } return $str;
}
public function return_names($str)
{ $names = array(); if( preg_match_all('/([@]+\w+)/', $str, $matches)){ $matches = array_slice($matches, 0, 1); for($i = 0; $i < count($matches); $i++) { $tag = $matches[0][$i]; $name = ltrim($tag, '@'); try{ $db = new PDO($this->db['dsn'], $this->db['username'], $this->db['password'], array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); }catch(\PDOException $e){} $sqlName = $db->prepare("SELECT `username` FROM `users` WHERE `username` = ?"); $sqlName->execute(array($name)); $retrievedUser = $sqlName->fetch(); if(!empty($retrievedUser)) { array_push($names, $name); } } } return $names;
}
}
?>

PHP: Класс
public function handle_user_link($str){ if( preg_match_all("/(@\w+)/", $str, $matches)){ $matches = array_slice($matches, 0, 1); foreach($matches[0] as $tag) { // capture each tag $name = ltrim($tag, '@'); try{ $db = new PDO($this->db['dsn'], $this->db['username'], $this->db['password'], array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); }catch(\PDOException $e){} $sqlName = $db->prepare("SELECT `username` FROM `users` WHERE `username` = ?"); $sqlName->execute(array($name)); $retrievedUser = $sqlName->fetch(); if(!empty($retrievedUser)) { // tagged user exists. $str = str_replace($tag, '<a href="profile.php?username='.$name.'">' . $tag . '</a>' , $str); } } } return $str; // End handle_user_link }
PHP:
 

Arbyz

Пользователь
Регистрация
01.07.12
Сообщения
1
Реакции
0
Баллы
1
Я обновил код выше. Я получил это, чтобы перестать спотыкаться о неизвестные теги раньше известных. Однако есть проблема со схожими именами. @JeremyBenson112 оборачивает ссылку вокруг той части, которая соответствует..
 

blacknot

Пользователь
Регистрация
01.01.70
Сообщения
2
Реакции
0
Баллы
1
Я многое почистил с помощью Dormolich, но есть проблема, по-видимому, суженная до той части, которая заставляет элемент a обтекать тег.

Эта часть


Код:
<?php
class pTagging{ private $db = array(); public function db_set($dbSet) { $this->db['dsn'] = $dbSet['dsn']; $this->db['username'] = $dbSet['username']; $this->db['password'] = $dbSet['password']; } public function handle_user_link($str){ if( preg_match_all("/@(\w+)/", $str, $matches)){ try{ $db = new PDO($this->db['dsn'], $this->db['username'], $this->db['password'], array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); }catch(\PDOException $e){} foreach($matches[0] as $tag) { $name = ltrim($tag, '@'); $sqlName = $db->prepare("SELECT `username` FROM `users` WHERE `username` = ?"); $sqlName->execute(array($name)); $retrievedUser = $sqlName->fetch(); if(!empty($retrievedUser)) { echo $name . '<br>'; $str = preg_replace("/@(\w+)/" , '<a href="profile.php?username='.$name.'">' . $tag . '</a>' , $str); } } } return $str;
}
public function return_names($str)
{ $names = array(); if( preg_match_all('/([@]+\w+)/', $str, $matches)){ $matches = array_slice($matches, 0, 1); for($i = 0; $i < count($matches); $i++) { $tag = $matches[0][$i]; $name = ltrim($tag, '@'); try{ $db = new PDO($this->db['dsn'], $this->db['username'], $this->db['password'], array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); }catch(\PDOException $e){} $sqlName = $db->prepare("SELECT `username` FROM `users` WHERE `username` = ?"); $sqlName->execute(array($name)); $retrievedUser = $sqlName->fetch(); if(!empty($retrievedUser)) { array_push($names, $name); } } } return $names;
}
}
?>

PHP: Я повторил здесь имя $name, и только JeremyBenson11 подходит. Причина, по которой я получаю метки там, где меня не должно быть, заключается в той маленькой детали, которая их создает. Есть понимание?

if(!empty($retrievedUser)) { echo $name . '<br>'; // tagged user exists. //$str = str_replace($tag, '<a href="profile.php?username='.$name.'">' . $tag . '</a>' , $str); $str = preg_replace("/@(\w+)/" , '<a href="profile.php?username='.$name.'">' . $tag . '</a>' , $str); }
PHP:
 
Сверху Снизу