在preg_replace函数期间删除字符

时间:2011-04-14 21:23:49

标签: php preg-replace character

我需要从字符串中提取一些文本,然后将该文本替换为在一个实例中删除的字符而不在另一个实例中删除。希望这个例子能告诉你我的意思(这是我到目前为止):

$commentEntry = "@Bob1990 I think you are wrong...";
$commentText = preg_replace("/(@[^\s]+)/", "<a target=\"_blank\" href=\"http://www.youtube.com/comment_search?username=${1}$1\">$1</a>", $commentEntry);

我希望结果是:

<a href="http://www.youtube.com/comment_search?username=Bob1990">@Bob1990</a> I think you are wrong...

但是我得到了:

 <a href="http://www.youtube.com/comment_search?username=@Bob1990">@Bob1990</a> I think you are wrong...

我一直在研究这个问题至少一个小时,几乎放弃了希望,所以非常感谢任何帮助!

3 个答案:

答案 0 :(得分:3)

可以尝试这样的事情

$commentText = preg_replace("/(@)([^\s]+)/", "<a target=\"_blank\" href=\"http://www.youtube.com/comment_search?username=$2\">$1$2</a>", $commentEntry);

答案 1 :(得分:0)

你可以做的是调整捕捉。将@移出大括号:

preg_replace("/@([^\s]+)/",

然后你可以编写替换字符串,如

'<a href="...$1">@$1</a>'

请注意第一个$1如何重新插入文字,第二个$1以逐字@作为前缀,以便重新插入。

答案 2 :(得分:0)

您正在捕捉模式中的@,因此当您使用$1时,它将始终输出。试试这个:

$commentText = 
  preg_replace(
    "/@([^\s]+)/", 
    "<a target=\"_blank\" href=\"http://www.youtube.com/comment_search?username=$1\">@$1</a>", 
    $commentEntry
  );

这里的区别在于@不再作为$1的一部分被捕获(即它只捕获Bob1990。因为它是字面值,所以它不需要是相反,我只是将它改为输出为元素文本中的文字值,直接在捕获的名称之前。(即它现在<a>@$1</a>而不仅仅是<a>$1</a>)。