与preg_match混淆

时间:2011-04-04 20:15:33

标签: php file preg-match


这可能是一个非常容易的问题...... 我真的不知道如何使用模式搜索(preg_match),我面对包含它的代码......

if (preg_match('!http://.*?/photos/.*?/(\d+)!i', 'http:/example.com/sites/default/files/1301584398_file.jpg', $match)) {
    $id = $match[1];
    $info = $f->photos_getInfo($id);
    $sizes = $f->photos_getSizes($id);
    foreach($sizes as $size => $sizedata) {
        if ($size == "Large" || $size == "Original") {
            $source = $sizedata['source'];
            if (preg_match('/\.(jpg|jpeg)$/i', $source)) {
                $jpg = imagecreatefromjpeg($source);
            }
            if (preg_match('/\.png$/i', $source)) {
                $jpg = imagecreatefrompng($source);
            }
            if (preg_match('/\.gif$/i', $source)) {
                $jpg = imagecreatefromgif($source);
            }
            break;
        }
    }

我最为困惑的是

preg_match('!http://.*?/photos/.*?/(\d+)!i', $url, $match)

这是为了什么?由于输入模式已经改变,我不知道它之前是如何看起来有点混乱...
另一个功能很清楚。它们旨在获取文件的扩展名。

3 个答案:

答案 0 :(得分:1)

!http://.*?/photos/.*?/(\d+)!i表示http://.*?/photos/.*?/(\d+)的不区分大小写的匹配,其中使用的模式分隔符为!

http://.*?/photos/.*?/(\d+)匹配其中包含/photos/的任何网址,然后匹配更多内容,以/和某些数字结尾。

.*?尝试匹配尽可能少的字符,可能根本不匹配。 \d+尝试匹配尽可能多的数字,最少为1。

答案 1 :(得分:1)

preg_match()是一个用于对字符串进行正则表达式匹配的函数,并将匹配存储到数组中。

第一个参数是正则表达式。它是用于定义匹配文本的模式的特殊语法。我强烈建议使用以下链接来学习正则表达式语法,因为它非常有用,虽然起初有点神秘而且难以破译。

Regular-Expressions.info

在你的模式中:

  • ! - 正则表达式分隔符
    (通常是正则表达式使用/,但我们需要在模式中使用斜杠。)
  • http:// - 字符串'http://'
  • 的字面匹配
  • .*? - 匹配任何字符(.),零次或多次(*),并且为“懒惰”(?)。
    (懒惰意味着:匹配尽可能少的字符数,同时仍然满足整个模式)
  • /photos/ - 另一个文字字符串匹配
  • .*? - 与上述相同的模式。 (0或更多任何char,告诉正则表达式引擎是懒惰的)
  • / - 正斜杠的文字字符串匹配'/'
  • ( ) - 在正则表达式中,括号是一个特殊字符。
    用于创建一个组,以便稍后引用为$ match [1]。
  • (\d+) - 匹配一个或多个数字\d+,并创建一个组以包含匹配。
  • i - 用于告诉正则表达式引擎忽略大小写的标志。

答案 2 :(得分:0)

本声明:

preg_match('!http://.*?/photos/.*?/(\d+)!i', $url, $match)

搜索http://字符串,然后搜索任意字符,直到第一个/,然后搜索photos/,然后搜索任何其他字符序列,直到另一个/,然后通过反向引用记录的一个或多个数字的序列。

换句话说,扫描第二段为photos的http链接并抓取网址末尾的数字ID。