php preg_使用不同的字符串替换每个事件

php preg_使用不同的字符串替换每个事件,php,regex,html,preg-replace,Php,Regex,Html,Preg Replace,假设有一个字符串$comment=“我在这里标记@abc和@def” 现在我想用一个链接替换以@开头的每个单词,该链接的href属性和链接文本是单词中@后面的内容。有关更多说明,请参见下面的示例。 在href属性和链接文本中,如@abc应替换为abc,@def应替换为def。 结果应该是这样的:$comment=“我正在标记,这里是” 我试过了,但我对此一无所知。如果您在理解问题时有任何问题,请发表评论。 提前感谢!:) 我会使用preg_replace的回调变量。对每个匹配调用一次回调。将实际

假设有一个字符串
$comment=“我在这里标记@abc和@def”

现在我想用一个链接替换以
@
开头的每个单词,该链接的href属性和链接文本是单词中
@
后面的内容。有关更多说明,请参见下面的示例。
在href属性和链接文本中,如
@abc
应替换为
abc
@def
应替换为
def

结果应该是这样的:
$comment=“我正在标记,这里是”

我试过了,但我对此一无所知。如果您在理解问题时有任何问题,请发表评论。

提前感谢!:)

我会使用preg_replace的回调变量。对每个匹配调用一次回调。将实际要用作关联数组索引的内容作为分组匹配项,将其作为$matches数组中的第二项

例如:


您可以使用正则表达式查找以
@
开头的单词边界(
\b
)结尾的所有文本。对于其中的每一个,您提取
@
后面的文本,并使用以下内容构建锚定标记:

echo preg_replace_callback('/@.+?\b/', function($m) {
    $str = substr($m[0], 1);
    return sprintf("<a href='%s'>%s</a>", $str, $str);
}, $comment);
echo preg_replace_回调('/@.+?\b/',函数($m){
$str=substr($m[0],1);
返回sprintf(“,$str,$str);
},$comment);

您可以使用单个搜索和替换来进行替换:

<?php

$string="I am tagging @abc and @def here";

$search='/\@(\w+)/';
$r='<a href="\1">\1</a>';

$s=preg_replace($search, $r, $string);

echo $s.PHP_EOL;

无论谁否决了它,请至少说明原因。我已经尝试过了-什么?@splash58显然是我在问题中想要的。只是我不知道如何以不同的方式替换每个事件?我无法指定
$links
数组,因为数组中的
@
的数量可能是可变的。我误解了您的要求。谢谢,它目前可以工作。我将进行一些检查,然后接受答案。我对答案添加了一些解释,也许这有助于您知道如何将上面的
return sprintf()
返回的所有字符串作为单独的元素放入不同的数组中?
$array=array();preg_replace_回调(..,函数($m)use($array){…$array[]=$m[0];…},…)
我猜
使用($array)
可能就是您希望能够使用在回调函数之外声明的变量的方法。这似乎不起作用
$array
在此之后不包含任何内容。回答中提到了
/@.+?\b/
作为正则表达式。这个正则表达式和你使用的正则表达式有什么区别?是否所有替换的字符串都可以放在一个单独的数组中?
\w
只匹配单词字符,而另一种解决方案匹配任何字符,直到单词边界。实际上没有太大区别。
<?php

$string="I am tagging @abc and @def here";

$search='/\@(\w+)/';
$r='<a href="\1">\1</a>';

$s=preg_replace($search, $r, $string);

echo $s.PHP_EOL;
$ php -f t.php 
I am tagging <a href="abc">abc</a> and <a href="def">def</a> here