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

  • Автор темы biohazardmonkey
  • 22
  • Обновлено
  • 16, May 2024
  • #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)

{

// 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

}

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++)

{

// capture each tag

$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))

{

// tagged user exists.

array_push($names, $name);

}

}

}

return $names;

// End return names

}

//End Class

}

?>
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:

biohazardmonkey


Рег
01 Jan, 2011

Тем
1

Постов
3

Баллов
13
  • 21, May 2024
  • #2
Я обновил код выше. Я получил это, чтобы перестать спотыкаться о неизвестные теги раньше известных. Однако есть проблема со схожими именами. @JeremyBenson112 оборачивает ссылку вокруг той части, которая соответствует..
 

Arbyz


Рег
01 Jul, 2012

Тем
0

Постов
1

Баллов
1
  • 09, Jun 2024
  • #3
Я многое почистил с помощью 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)

{

// capture each 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>';

// 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);

}

}

}

return $str;

// End handle_user_link

}

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++)

{

// capture each tag

$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))

{

// tagged user exists.

array_push($names, $name);

}

}

}

return $names;

// End return names

}

//End Class

}

?>

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:
 

blacknot


Рег
01 Jan, 2011

Тем
0

Постов
2

Баллов
2
Тем
49554
Комментарии
57426
Опыт
552966

Интересно