Php 如何使用preg_替换并获得匹配?
我有一个文本,其中包含以@symbol开头的用户名。例如: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
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
)
)