php preg_replace 每次出现不同的字符串

php preg_replace each occurence with different string

假设有一个字符串$comment = "I am tagging @abc and @def here".
现在我想用 link 替换每个以 @ 开头的单词,其 href 属性和 link 文本是单词中 @ 之后的内容。请参阅下面的示例以获得更多说明。
@abc 应该替换为 abc 并且 @def 应该替换为 href 属性中的 def 和 link 文本。
结果应该类似于:$comment = "I am tagging <a href='abc'>abc</a> and <a href='def'>def</a> here".
我试过了,但我对此一无所知。如果您对问题的理解有任何问题,请发表评论。
提前致谢! :)

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

例如:

$res = preg_replace_callback( 
    "/@([a-z]+)/",
    function ( $matches ){
        $links = array( 'abc' => 'http://....abc', 'def' => 'http://....def' );
        return $links[ $matches[ 1 ] ];
    },
    "I am tagging @abc and @def here"
);

echo $res;

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

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

您可以使用一次搜索和替换来进行替换:

<?php

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

$search='/\@(\w+)/';
$r='<a href=""></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