PHP preg_match_all和str_replace

时间:2012-01-23 15:24:09

标签: php str-replace

我对preg_match_all和str_replace

有一点问题
<?
    $source = 'hello @user_name, hello @user_name2, hello @user_name3';
    preg_match_all("/@[\w\d_]*/s", $source, $search);
    foreach($search[0] as $result) {
        $source = str_replace($result, "<b>okay</b>", $source);
    }

    echo $source;
?>

结果是(错误的):

hello <b>okay</b>, hello <b>okay</b>2, hello <b>okay</b>3

正确的结果应该是这样的:

hello <b>okay</b>, hello <b>okay</b>, hello <b>okay</b>
任何人都可以帮忙吗? 谢谢!

2 个答案:

答案 0 :(得分:1)

这种情况正在发生,因为第一场比赛@user_name也会匹配@user_name2@user_name3(至少是@user_name部分)。你写它的方式,它按照预期的方式工作。您可能希望查看preg_replace()。为了测试正则表达式模式,我总是使用My Regex Tester(实际上不是我的,这只是它的名字)。这是该站点的输出,包括生成的代码:

Raw Match Pattern:
@[\w\d_]*

Raw Replace Pattern:
okay

PHP Code Example: 
<?php
$sourcestring="hello @user_name, hello @user_name2, hello @user_name3";
echo preg_replace('/@[\w\d_]*/s','<b>okay</b>',$sourcestring);
?>

$sourcestring after replacement:
hello <b>okay</b>, hello <b>okay</b>, hello <b>okay</b>

答案 1 :(得分:0)

问题不在于preg_match_all或preg_replace。问题在于str_replace。 创建搜索数组后,第一个标记包含值“user_name”, str_replace 函数替换字符串中的所有三个匹配项。所以1和2的值保持不变,就像它在字符串中一样。

如果您将来源更改为

$source = 'hello @user_name1, hello @user_name2, hello @user_name3';

它会正常工作。否则你需要以相反的顺序迭代数组