2010-04-07 4 views
0

Я проектирую сайт с системой комментариев, и мне бы понравилась система ответов Twitter.PHP replace string help

Если пользователь поставил @a_registered_username, я хотел бы, чтобы он стал ссылкой на профиль пользователя.

Я думаю, что preg_replace - это функция, необходимая для этого.

$ ALL_USERS_ROW * ['USERNAME'] - массив запросов к базе данных для всех пользователей, а ['USERNAME'] - это строка имени пользователя.

$ содержание комментарий, содержащий @Username

я думаю, что это не должно быть очень трудно решить для тех, кто хорошо PHP.

Кто-нибудь знает, как это сделать?

+0

Хороший способ проверки шаблонов регулярных выражений: http://www.gskinner.com/RegExr/, я обычно начинаю с создания базового шаблона с помощью http://www.txt2re.com/ – SeanJA

ответ

1

Вы хотите, чтобы пройти через текст и получить его, здесь является хорошей отправной точкой:

$txt='this is some text @seanja'; 

$re1='.*?'; # Non-greedy match on filler 
$re2='(@)'; # Any Single Character 1 
$re3='((?:[a-z][a-z]+))'; # Word 1 

if ($c=preg_match_all ("/".$re1.$re2.$re3."/is", $txt, $matches)) 
{ 
     $c1=$matches[1][0]; 
     $word1=$matches[2][0]; //this is the one you want to replace with a link 
     print "($c1) ($word1) \n"; 
} 

Сформирован с:

http://www.txt2re.com/index-php.php3?s=this%20is%20some%20text%[email protected]&-40&1 

[править]

На самом деле, если вы идете сюда (http://www.gskinner.com/RegExr/) и ищите твиттер на вкладке сообщества справа, вы найдете пару действительно хороших решений для этой точной проблемы:

$mystring = 'hello @seanja @bilbobaggins [email protected] and @slartibartfast'; 
$regex = '/(?<[email protected])((\w+))(\s)/g'; 
$replace = '<a href='http://twitter.com/$1' target="_blank">$1</a>$3'; 
preg_replace($regex, $replace, $myString); 
+0

Очевидно, что вы хотите сделать это до того, как он попадет в базу данных ... – SeanJA

+0

исправил регулярное выражение во втором, чтобы оно не соответствовало электронным письмам. – SeanJA

2
$content = preg_replace("/\[email protected](\w+)\b/", "http://twitter.com/$1", $content); 

должен работать, но я не могу получить слово граничные матчи работать в моем тесте ... может быть, в зависимости от используемой библиотеки регулярных выражений в версиях PHP

$content = preg_replace("/(^|\W)@(\w+)(\W|$)/", "$1http://twitter.com/$2$3", $content); 

тестируется и работает

+0

Я согласен, что это работает, за исключением того, что по какой-то причине кажется, что оно соответствует пробелу после @word (по крайней мере, когда я проверяю его с помощью http://www.gskinner.com/RegExr/) – SeanJA

+0

, он соответствует пробелу после, да, и раньше (чтобы проверить, что @ не посередине, как адрес электронной почты). Вот почему я поместил оба пространства в ($ 1 и $ 3) в значение замены. –

+0

А, хорошее решение проблемы, что у моего второго примера есть – SeanJA

0
$str = preg_replace('~(?<!\w)@(\w+)\b~', 'http://twitter.com/$1', $str); 

Не подходит для электронных писем. Не соответствует никаким пространствам вокруг него.