Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使用preg_替换并获得匹配?_Php_Regex - Fatal编程技术网

Php 如何使用preg_替换并获得匹配?

Php 如何使用preg_替换并获得匹配?,php,regex,Php,Regex,我有一个文本,其中包含以@symbol开头的用户名。例如: One day @john decided to ask @jane out. <pre> <?php $arr = array(); function linker( $matches ) { global $arr; $arr[] = $matches[1]; return "link-{$matches[1]}"; } $text = "One day @john decided

我有一个文本,其中包含以@symbol开头的用户名。例如:

One day @john decided to ask @jane out.
<pre>
<?php

$arr = array();

function linker( $matches ) {
    global $arr;
    $arr[] = $matches[1];
    return "link-{$matches[1]}";
}

$text = "One day @john decided to ask @jane out.";
$result = preg_replace_callback('`@([a-zA-Z0-9]{2,15})`', "linker", $text);

echo $result . "\n";    
print_r( $arr );
?>
</pre>
我想用一个链接替换所有出现的用户名,举个例子,假设我想用link user替换@user,例如:

One day link-john decided to ask link-jane out.
这可以通过以下命令完成:

preg_replace('`@([a-zA-Z0-9]{2,15})`', 'link-$1', $text);
此外,我想获得一个所有匹配的数组,就像preg_match会做的一样,但我无法,因为preg_replace似乎没有提供该数组。实现这一目标最有效的方法是什么?我觉得做preg_比赛和后来的preg_替换会浪费资源,不是吗

如果您觉得有更好的方法来实现这一点,我将感谢您的反馈

谢谢

您可以使用:

如果您使用的是PHP5.3,则可以使用匿名函数使其更干净。

您可以使用:


如果您使用的是PHP5.3,则可以使用匿名函数使其更简洁。

和另一种使用现代5.3语法的preg_replace_回调:

Array
(
    [0] => Array
        (
            [0] => @john
            [1] => john
        )

    [1] => Array
        (
            [0] => @jane
            [1] => jane
        )

)

preg_replace_回调的另一个变体使用现代5.3语法:

Array
(
    [0] => Array
        (
            [0] => @john
            [1] => john
        )

    [1] => Array
        (
            [0] => @jane
            [1] => jane
        )

)

不,没有更好的选择了。您可以使用
preg\u replace\u callback
在回调中替换和组装匹配项。但这并不是真正的“更好”关于资源,总是在分析之后进行优化。不,没有更好的选择。您可以使用
preg\u replace\u callback
在回调中替换和组装匹配项。但这并不是真正的“更好”关于资源,总是在分析后进行优化。由于我不需要使用全局声明“global$arr;”,因此此验证是否更有利?当然,使用
global
是非常老派的风格。PHP5.3为我们提供了新的机会。虽然使用全局是另一种方式。您决定适合您的选项。由于我不需要使用全局声明“global$arr;”,因此此验证是否更有利?当然,使用
global
是一种非常老派的风格。PHP5.3为我们提供了新的机会。虽然使用全局是另一种方式。您决定什么适合您。您的意思是我不必使用global$arr@Leo是的,如果你有PHP5.3,一定要像其他答案一样使用匿名函数。我发布了这个版本,因为我不确定你是否有5.3。你的意思是我不必使用全局$arr@Leo是的,如果你有PHP5.3,一定要像其他答案一样使用匿名函数。我发布了这个版本,因为我不确定你是否有5.3版本。
Array
(
    [0] => Array
        (
            [0] => @john
            [1] => john
        )

    [1] => Array
        (
            [0] => @jane
            [1] => jane
        )

)