php preg_replace每个事件用不同的字符串

时间:2018-11-06 13:51:18

标签: php html regex html5 preg-replace

假设有一个字符串$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"
我已经尝试过了,但是对此我完全空白。如果您在理解问题上有任何疑问,请发表评论。
提前致谢! :)

3 个答案:

答案 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;