Тагване на думи

AnyB1s

Registered
Здравейте,
в момента съм пред малко затруднение около един скрипт. Идеята да се тагнат няколко думи, примерно : Иван, Георги

и имам една статия с дълъг текст и където намери тези имена да ги замества с линк към тяхния профил

Ако можете да ми предложите някаква идея как да го направя.
Благодаря предварително!
 
Имам подобна тема малко по-надолу. Никой не казва. :)

В твоя случай пробвай с:
PHP:
$string = "foo is foobar";
$word = "foo";
$string = preg_replace("/($word)/","<a href=\"$1.html\">$1</a>",$string);

echo $string;
 
добре, ако сложа примерно повече думи за replace, примерно ако съм добавил много имена как да ги насоча към кое да водят, примерно ако ID-то на потребителя е 4 и името му е Иван, в текста да замествам "Иван" с линк към профила му примерно profile.php?id=4
 
AnyB1s каза:
добре, ако сложа примерно повече думи за replace, примерно ако съм добавил много имена как да ги насоча към кое да водят, примерно ако ID-то на потребителя е 4 и името му е Иван, в текста да замествам "Иван" с линк към профила му примерно profile.php?id=4

Дам... и аз до тука стигнах. При малко на брой имена, можеш с много if-ове. И .htaccess за да си направиш урл-а сайт.ком/user.

Няма да е лошо някой по просветен да се намеси :).
 
Трябва да е нещо такова:

Код:
<?php
$users = array();
$links = array();
$string = 'Ivan asd bla bla bla Toshko'; // Текста или статията е в този стринг

//$users[ид-то на потребителя] = 'Името на потребителя';
$users[1] = 'Ivan';
$users[5] = 'Toshko';
$users[222] = 'Strahil';

foreach($users as $key => $value)
{
    $links[$value] = '<a href="profile.php?id=' . $key . '">' . $value . '</a>';
}

foreach($links as $key => $value)
{
    $string = str_replace($key, $value, $string);
}

На str_replace може да се дават и масиви за заместване, но понеже не съм тествал кода не мога да съм сигурен, че ще работи(може би не много по ефективно, но все пак и този код предполагам би ти свършил работа).
 
е защо да го прави ръчно? :D
да кажем че имаш таблица users с полета id и name

PHP:
<?php  
$text = "blaga fd fsd fdsf d [b]ivan [/b]dajjdfew [b]IzKuFeLiQqQqQ[/b]";//може и да го изкарваш от базата данни текста
$query = mysql_query("SELECT id,name FROM users")or die(mysql_error());
while($row = mysql_fetch_assoc($query )) { 
$id = $row['id'];
$name = $row['name'];
$text = preg_replace('/$name/i','<a href="profile.php?id='.$id.'">'.$name.'</a>',$text);
}
?>

надявам се да съм ти помогнал :)
 
IzKuFeLiQqQqQ каза:
е защо да го прави ръчно? :D
да кажем че имаш таблица users с полета id и name

PHP:
<?php  
$text = "blaga fd fsd fdsf d [b]ivan [/b]dajjdfew [b]IzKuFeLiQqQqQ[/b]";//може и да го изкарваш от базата данни текста
$query = mysql_query("SELECT id,name FROM users")or die(mysql_error());
while($row = mysql_fetch_assoc($query )) { 
$id = $row['id'];
$name = $row['name'];
$text = preg_replace('/$name/i','<a href="profile.php?id='.$id.'">'.$name.'</a>',$text);
}
?>

надявам се да съм ти помогнал :)


PHP:
'/$name/i'

това трябва да стане така

PHP:
'/'.$name.'/i'

иначе така ще търси точно $name, а не това, което съдържа променливата.
 
Така ми вади само последния запис от масива. А ако се даде:
PHP:
echo $text;
в цикъла while, вади целия текст много пъти, като всеки път реплейсва следващата дума.
 
PHP:
<?php  
header("Content-Type: text/html; charset=UTF-8");
$cn = mysql_connect("localhost", "root", "") or die(mysql_error());
mysql_select_db('test', $cn) or die(mysql_error());

$text = "Иван попитал учителката дали можел да прави джиджибиджи с Мария, от класа на Станислава";

mysql_query("SET NAMES utf8");
$query = mysql_query("SELECT `id`, `users` FROM `users`");

while($row = mysql_fetch_assoc($query)) { 
	$text = preg_replace('/'.$row['users'].'/i', '<a href="profile.php?id='.$row['id'].'">'.$row['users'].'</a>', $text);
}

echo $text;
?>

;)
 
Релакс сигурен ли си че бачка това? Баси на мен други масиви ли ми връща заявката...

Почти същата ми е, само дето вместо да прави на линк замества думите.

PHP:
$text = preg_replace('/'.$duma.'/i', $duma2, $string);

дума1 и дума2 са си нормални $duma = $row['duma'];
Замества ми само намерено за последния резултат. Има някаква бъгня.

Анубис сорка че ти спамя темата.
 
Дай си целия код да видя.


P.S. Ако се опитваш да тагваш и имена с малки букви, а в базата данни са с главни, то сложи и модификатор u
P.S.
3917733m.png
 
Няма главни букви.

PHP:
$sql = mysql_query("SELECT * FROM dumi");

	while($row = mysql_fetch_assoc($sql)) {
        
		
		$duma1 = $row['duma1'];
		
		$duma2 = $row['duma2'];
		
		
		$text = preg_replace('/'.$duma.'/i', $duma2, $string);
				
	}

echo $text;

БД:
CREATE TABLE IF NOT EXISTS `dumi` (
`duma1` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`duma2` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
KEY `duma1` (`duma1`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

и не ще, реплейсва само последния запис от базата.
 
E $duma от къде идва $duma2 какво ти е? То намира някаква дума, ама не виждам как я преобразуваш. В смисъл такъв, нито я правиш на линк, нито и правиш някакви други модификации, за да разбереш дали се променя.

Другото, ако $string ти е главния текст, то трябва да стане

PHP:
$string = preg_replace(...., ...., $string);

}

echo $string;

Дай примерен $string и кажи $duma, $duma1 и $duma2 какво съдържат. Също виж дали спазваш кодировката на таблицата и колоните, с тази на файла и чарсета. Ако всичко ти е на кирилица и ползваш utf8_general_ci то сложи най-отгоре на кода

PHP:
header("Content-Type: text/html; charset=UTF-8");

и преди заявката със селекта

PHP:
mysql_query("SET NAMES utf8");

Също пробвай да добавиш в preg_replace u модификатора да тестваш.
 
Едит на цялата простотия. СУпер тъп съм оказа се променливата, че е различна.

$text - $string.

Релакс мерси, баси 2 дена се нервирам с това :)
 
Аз обаче, ще продължа да си спамя в тая тема. :)
Оказа се, че в моя случай това работи ама никак не ми върши работа.

Това нещо риплейсва всеки стринг, не само точната дума.

И ако имам в ДБ 'те' и 'ски', а стринга е 'тетевенски' става мазало. :)

Значи е време да питам има ли модификатор за точно съвпадение.

Хоп, пак едит сам си отговарям :)

PHP:
'/\b'.($duma).'\b/iu'
 

Back
Горе