我有以下代码:
<?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']
那么,我怎么能得到最后的结果?
答案 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
)
现场演示:
注意:
“这是数组的一个例子......”
我不知道任何编程语言哪些数组是用大括号{}
声明的,对象通常是。你的意思是括号[]
吗?