0

这个正则表达式模式的东西让我很困惑。

我有一个用户名,例如@tom存储在变量中。我想设置一个模式以@tom在字符串中的任何位置找到它时进行匹配;开头、中间或结尾。

我的目标是匹配并替换为他的个人资料页面的链接。我想我已经弄清楚了,但它没有识别单词的结尾。就像它在寻找它的时候一样,@tom它也与@tommy我不想要的匹配。

这是我到目前为止所拥有的:

$pattern = array();
$pattern[0] = '/'.$possible1.'/i';

$replacement = array();
$replacement[0] = '$1<a href="http://banterme.com/'.$possible1user.'">@'.$possible1user.'</a>';

echo preg_replace($pattern, $replacement, $text);

我使用数组是因为我想匹配文本中的所有@(例如:@tom 与@inga 匹配),而不仅仅是一个。我简化了实际代码以仅显示数组的一部分。

更新:基本上,我试图弄清楚什么'/'.$possible1.'/i'应该不匹配(例如)@tom@tommy.

4

3 回答 3

3

这够好吗?/(?!\w)\@tom(?!\w)/?
我只是添加了边界..

@HamZa DzCyber​​DeV 作为上面的评论给出的那个更短/\@tom(?!\w)/

你可以在这里查看:

http://www.spaweditor.com/scripts/regex/index.php

数据为@tom @tomato @atom @tom

这将返回 @tomato @atom

于 2013-04-30T21:56:46.390 回答
1

为什么不直接使用 str_replace?

str_replace ("@tom" , "<a href='/users/tom'>@tom</a>" , $text);

听起来你不需要正则表达式。

于 2013-04-30T21:36:53.043 回答
0

尝试这个

$count = null;
$returnValue = preg_replace('/@([\w]+)[^\w]/', '<href="http://banterme.com/$1">@$1</a> ', '@tom met @dave somewhere', -1, $count);
于 2013-04-30T21:50:45.380 回答