【问题标题】:PHP return preg_replace() inside of foreach?PHP在foreach中返回preg_replace()?
【发布时间】:2011-06-30 12:20:06
【问题描述】:

嘿, 我不知道我做错了什么。 我有一个正则表达式模式,可以在内部查找 youtube url 或 [track=url]。

如果匹配正则表达式,我将返回一个 youtube 嵌入代码。我需要为每个视频设置一个唯一的 ID。我正在我的 preg_match_all foreach 循环中使用一个简单的计数变量创建此 ID。

每个视频所需的 $uniqueID 都可以正常工作。如果我的 $content 中有 3 个 [track=url],我会得到 3 个不同的 id 回显(player_1、player_2、player_3 等...)

但是,我唯一的主要问题是我不知道在这种情况下我是如何使用 preg_replace 的。我需要使用我正在创建的每个唯一 ID 返回每个视频的 embedCode。

<?php

    $youtubeUrl = "/(\[TRACK=)((http|https)(\:\/\/)(www|it|co\.uk|ie|br|pl|jp|fr|es|nl|de)(\.youtube\.)(com|it|co\.uk|ie|br|pl|jp|fr|es|nl|de)([a-zA-Z0-9\-\.\/\?_=&;]*))(\])/si";

    $search = preg_match_all($youtubeUrl, $content, $matches, PREG_OFFSET_CAPTURE);
    $i = 0;

    foreach ($matches[8] as $match) {

        $watch = $match[0];

        //unique id
        $uniqueID = "player_" . $i; // player_0, player_1, player_2 ...

        //final video url
        $video = $uri . $watch;

        echo $video . "<br/>"; //correct 3 times different

        $content = preg_replace($youtubeUrl, embedCode($video, $uniqueID), $content);
        // three times player_0

        $i++;
    }

    //$content = preg_replace($youtubeUrl, embedCode($video, $uniqueID), $content);
    // three times player_3

    return $content;

?>

知道我需要在这里做什么吗?我很无奈! 如果我在循环内调用 preg_replace,我会得到 player_0 的 embed_code 的三倍,如果我在 foreach 循环外调用它,我会得到三倍的 player_3。

我在这里做错了什么!非常感谢您的帮助。

【问题讨论】:

    标签: php loops preg-replace preg-match-all


    【解决方案1】:

    您不应手动循环匹配结果,然后再运行第二个 preg_replace。这是 preg_replace_callback 简化事情的完美用例:

    $i = 0;
    $content = preg_replace_callback($rx_youtubeUrl, "cb3", $content);
    
    function cb3 ($match) {
    
        $watch = $match[8];
        global $i, $uri;
        $i++;
    
        //unique id
        $uniqueID = "player_" . $i; // player_0, player_1, player_2 ...
    
        //final video url
        $video = $uri . $watch;
    
        return embedCode($video, $uniqueID);
    }
    

    对于 $uniqueID,您可能必须使用全局或静态变量。

    相同的 ID 出现 3 次是由于 preg_replace 运行在所有出现的正则表达式上造成的。它不只是找到当前的[TRACK=..,而是一次全部删除。您也可以使用静态 str_replace。

    【讨论】:

    • @mathiregister:您只需要将循环内容放入函数中。使用$watch=$match[8]; 代替列表,并添加global $i;
    猜你喜欢
    • 2017-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-03
    • 1970-01-01
    • 2017-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多