正则替换时的一个潜在问题,几乎折服所有新老手!

通常正则替换(preg_replace)会用 $1 或 \1 来作反向引用,如下:

‘$1′ . $string . ‘$2′ 或 ‘\1′ . $string . ‘\2′ 原意是在它们之间插入 $string

这本身也没什么问题,但当 $string 的值以数字开头时?比如 string = “4fabc” 那么,此时的 $1 直接连接了 string 将被正则引擎当作 $14 而不是 $1 了,所以不仅 $1 消失了,连 string 中的 ‘4’ 也被吃掉了~~

解决办法就是改用 ${1}, ${2} ….

这是实战过程碰到的问题,分享给大家了!

正则替换时的一个潜在问题,几乎折服所有新老手!》上有2条评论

  1. hightman

    题目:现在有个文件里有40亿条无重复整型数,为4字节无符号数,或者说,0 到 2的32次方。下面要求你写一个程序,列出所有 0 -2的32次方里,该文件不存在的整数。注意你的系统可用内存是有限的,也许只有1G或2G。如果这40亿条有重复,有什么区别?

    以下是我的解答方式(用PHP表述,区间的存储可以考虑改为二叉树结构可能更合适一些,避免大量的内存拷贝)
    [code]
    < ?php
    // 在40亿不重复的数中求出不在里面的数
    define ('MAX_VALUE', (1<<32));
    $zones = array(array(1, MAX_VALUE));

    // 一次遍历取得所有的数
    while (($num = get_num()) !== false) push_num($num);

    // 打印出不在列表中的数的范围
    echo "Memory usage: " . number_format(memory_get_usage()) . "\n";
    print_r($zones);

    // 加数进行区间裂变
    function push_num($num)
    {
    global $zones;
    $index = zone_get($num);
    if ($zones[$index][0] === $zones[$index][1])
    {
    $zones = array_merge(array_slice($zones, 0, $index), array_slice($zones, $index+1));
    }
    else if ($num === $zones[$index][0])
    {
    $zones[$index][0]++;
    }
    else if ($num === $zones[$index][1])
    $zones[$index][1]--;
    else
    {
    $newzone = array($num+1, $zones[$index][1]);
    $zones[$index][1] = $num-1;
    $zones = array_merge(array_slice($zones, 0, $index+1), array($newzone), array_slice($zones, $index+1));
    }
    }

    // 取得某个数所在的区间
    function zone_get($num)
    {
    global $zones;

    $low = $mid = 0;
    $high = count($zones)-1;
    while ($low <= $high)
    {
    $mid = (($low+$high)>>1);
    if ($num < $zones[$mid][0])
    $high = $mid - 1;
    else if ($num > $zones[$mid][1])
    $low = $mid + 1;
    else
    break;
    }
    return $mid;
    }

    // 返回一个不重复的数 (FAKE)
    // 实际实现可以从文件或从其它列表中依次读取, 这是一个伪实现方式
    function get_num()
    {
    static $num = 1;
    while (!mt_rand(0, 3)) $num++;
    $num++;
    if ($num > MAX_VALUE) return false;
    return $num;
    }
    [/code]

    回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>