转换数组中替换的字符串

时间:2018-04-16 20:22:01

标签: php arrays regex

我有以下代码:

<?php
$text = 'Hey @Mathew, have u talked with @Jhon today?';
    $text = preg_replace('/(^|\s)@([A-Za-z0-9]*)/', '\1<a href="profile.php?user=\\2">@\\2</a>',$text);
?>

我的目标是通知用户被引用。 为此,我想:我把所有被替换的字符串放在一个数组中并只选择名称;使用上面的例子,按照这个想法,我得到了这个结果:

['Mathew', 'Jhon']

那么,我怎么能得到最后的结果?

3 个答案:

答案 0 :(得分:2)

您可以在执行基于正则表达式的搜索时实际收集匹配项,并在使用preg_replace_callback时替换:

$text = 'Hey @Mathew, have u talked with @Jhon today?';
$names = [];
$text = preg_replace_callback('/(^|\s)@([A-Za-z0-9]*)/', function($m) use (&$names) {
        $names[] = $m[2];
        return $m[1] . '<a href="profile.php?user=' . $m[2] . '">@' . $m[2] . '</a>';
    },$text);
echo "$text\n";
print_r($names);

请参阅PHP demo

输出:

Hey <a href="profile.php?user=Mathew">@Mathew</a>, have u talked with <a href="profile.php?user=Jhon">@Jhon</a> today?
Array
(
    [0] => Mathew
    [1] => Jhon
)

请注意,匹配的数组变量将使用use (&$names)语法传递给匿名函数。 $m是一个匹配对象,包含第一个项目中的整个匹配项,并在后续项目中进行捕获。

答案 1 :(得分:1)

在替换文本之前,您可以使用preg_match查找字符串中的所有用户:

http://php.net/manual/en/function.preg-match.php

示例:

$text = 'Hey @Mathew, have u talked with @Jhon today?';

preg_match($pattern, $text, $matches);
var_dump($matches);

$text = preg_replace('/(^|\s)@([A-Za-z0-9]*)/', '\1<a href="profile.php?user=\\2">@\\2</a>',$text);

你必须改变你的模式才能发挥作用。

答案 2 :(得分:0)

我猜你可以使用像/@[a-z0-9]+/sim这样的正则表达式,即:

$text = 'Hey @Mathw, have u talked with @Jhon today?';
preg_match_all('/@[a-z0-9]+/sim', $text , $handles_array, PREG_PATTERN_ORDER);
$text = preg_replace('/(@[a-z0-9]+)/sim', '<a href="profile.php?user=$1">$1</a>', $text);
print($text);
print_r($handles_array[0]);

<强>输出:

Hey <a href="profile.php?user=@Mathw">@Mathw</a>, have u talked with <a href="profile.php?user=@Jhon">@Jhon</a> today?Array
(
    [0] => @Mathw
    [1] => @Jhon
)

现场演示:

https://ideone.com/oU6xbb

注意:

  

“这是数组的一个例子......”

我不知道任何编程语言哪些数组是用大括号{}声明的,对象通常是。你的意思是括号[]吗?