如果/ else / elseif语句解析不正确

时间:2012-01-31 23:57:30

标签: php regex if-statement

我试图让这个if语句如下:如果第一个字符串位置是.png,那么从大海捞针获得$ png1,但如果第一个字符串位置是.jpg,那么从大海捞针获取$ jpg1,但是如果它是.gif,从haystack获取$ gif1,否则如果找不到它们,那么字符串位置是.bmp所以得到$ bmp1

这是我尝试过的,但它没有正确解析:

/***************************** 1st image in email**********************************/
        // if first occurence is .png get $png1 needle from haystack
    if (preg_match('/cid:([^"@]*).png@([^"]*)/', $html_part))           
    {           $find = '/cid:([^"@]*).png@([^"]*)/';   
                $replace1 = $png1;
                $html_part = preg_replace($find, $replace, $html_part);
    }
        // if first occurence is .jpg get $jpg1 needle from haystack
        elseif (preg_match('/cid:([^"@]*).jpg@([^"]*)/', $html_part)) 
    {           $find = '/cid:([^"@]*).jpg@([^"]*)/';   
                $replace1 = $jpg1;
                $html_part = preg_replace($find, $replace, $html_part);
    }
        // if first occurence is .gif then get $gif1 needle from haystack
        elseif (preg_match('/cid:([^"@]*).gif@([^"]*)/', $html_part)) 
    {           $find = '/cid:([^"@]*).gif@([^"]*)/';
                $replace = $gif1;
                $html_part = preg_replace($find, $replace, $html_part);
    }
        // if first occurence is .bmp then get $bmp1 needle from haystack
        else
    {           $find = '/cid:([^"@]*).bmp@([^"]*)/';
                $replace = $bmp1;
                $html_part = preg_replace($find, $replace, $html_part);
    }

并重复了5张图片 问题是if语句不会像我希望的那样返回。他们只是将参考文献替换为整个序列中匹配的最后一个东西(按重复这5次的顺序)

示例$ html_part,其中添加了换行符以供显示:

<b>Bold Text.</b> <i>Italicized Text.</i> <u>Underlined Text.</u> Plain Unformatted Text. <img width=183 height=183 id="Picture_x0020_3" src="cid:image001.png@01CCCB31.E6A152F0" alt="Description: Description: Description: cid:image001.png@01CCC701.5A896430"> <img width=153 height=145 id="Picture_x0020_2" src="cid:image002.jpg@01CCCB31.E6A152F0" alt="Description: Description: cid:image002.jpg@01CCCB1D.D3A29740"><img width=182 height=123 id="Picture_x0020_1" src="cid:image003.jpg@01CCCB31.E6A152F0" alt="Description: Description: cid:image003.jpg@01CCCB1D.D3A29740">

有人可以帮我找到解决方法吗?感谢

2 个答案:

答案 0 :(得分:0)

当您使用$replace1时,您正在使用$replace

如果这只是你问题中的一个错字,这是一个更紧凑的方式来做同样的事情:

if (preg_match('/cid:([^"@]*).(png|jpg|gif|bmp)@([^"]*)/', $html_part, $m)){

    $find = '/cid:([^"@]*).'.$m[2].'@([^"]*)/';

    $replace = $png1;
    if ($m[2] == 'jpg') $replace = $jpg1;
    if ($m[2] == 'gif') $replace = $gif1;
    if ($m[2] == 'bmp') $replace = $bmp1;

    $html_part = preg_replace($find, $replace, $html_part);
}

答案 1 :(得分:-1)

我相信我可能终于找到了一个非OOP用于php的可爱变量

    // Slightly verbose for demo purposes
    $path = 'C://test.jpg';

    // Get the path info with PATHINFO_DIRNAME, PATHINFO_BASENAME, PATHINFO_EXTENSION and PATHINFO_FILENAME.
    $pathinfo = pathinfo($path);

    // Check file extensions first to avoid E_NOTICE of index 'extension'
    if (isset($pathinfo['extension']) !== false)
    {
        // Get the file extension and append '1' as per OP's spec
        $extension = $pathinfo['extension'] . '1';

        // Make sure that the image exists before using it ($jpg1)
        if (isset($$extension) !== false)
        {
            // Funny stuff
        }
    }

在此示例中,$ extension的值最终为'jpg1',因此如果将$$扩展名传递给isset(),则函数会检查$ jpg1是否已设置。

关于最初发布的代码的快速评论:

而不是迭代地调用preg_match,直到找到结果,你找到它最好一次识别文件扩展名然后使用开关(elseif很好),因为只需要一个核心字符串比较。