假设有一个字符串$comment = "I am tagging @abc and @def here"
。
现在,我要替换以@
开头的每个单词,并使用一个链接,该链接的href属性和链接文本位于该单词@
之后。请参阅下面的示例以获取更多说明。
就像在href属性和链接文本中将@abc
替换为abc
,将@def
替换为def
。
结果应类似于:$comment = "I am tagging <a href='abc'>abc</a> and <a href='def'>def</a> here"
。
我已经尝试过了,但是对此我完全空白。如果您在理解问题上有任何疑问,请发表评论。
提前致谢! :)
答案 0 :(得分:2)
您可以使用一次搜索进行替换并替换:
<?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
答案 1 :(得分:1)
您使用正则表达式查找以\b
开头的所有以单词边界(@
)结尾的文本。对于其中的每一个,您都提取@
之后的文本,并以此构建锚标记:
echo preg_replace_callback('/@.+?\b/', function($m) {
$str = substr($m[0], 1);
return sprintf("<a href='%s'>%s</a>", $str, $str);
}, $comment);
答案 2 :(得分:-1)
我将使用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;