【问题标题】:Strict standards: Only variables should be passed by reference in get_id.php on line 27严格的标准:只有变量应该在第 27 行的 get_id.php 中通过引用传递
【发布时间】:2025-11-28 08:00:01
【问题描述】:

我在 php 中收到以下通知: 严格的标准:只有变量应该在第 27 行的 get_id.php 中通过引用传递

代码是:

<?php
function truncate($text, $length, $suffix ='', $isHTML = true) {
    $i = 0;
    $simpleTags=array('br'=>true,'hr'=>true,'input'=>true,'image'=>true,'link'=>true,'meta'=>true);
    $tags = array();
    if($isHTML){
        preg_match_all('/<[^>]+>([^<]*)/', $text, $m, PREG_OFFSET_CAPTURE | PREG_SET_ORDER);
        foreach($m as $o){
            if($o[0][1] - $i >= $length)
                break;
            $t = substr(strtok($o[0][0], " \t\n\r\0\x0B>"), 1);
            // test if the tag is unpaired, then we mustn't save them
            if($t[0] != '/' && (!isset($simpleTags[$t])))
                $tags[] = $t;
            elseif(end($tags) == substr($t, 1))
                array_pop($tags);
            $i += $o[1][1] - $o[0][1];
        }
    }

    // output without closing tags
    $output = substr($text, 0, $length = min(strlen($text),  $length + $i));
    // closing tags
    $output2 = (count($tags = array_reverse($tags)) ? '</' . implode('></', $tags) . '>' : '');

    // Find last space or HTML tag (solving problem with last space in HTML tag eg. <span class="new">)
    $pos = (int)end(end(preg_split('/<.*>| /', $output, -1, PREG_SPLIT_OFFSET_CAPTURE)));
    // Append closing tags to output
    $output.=$output2;

    // Get everything until last space
    $one = substr($output, 0, $pos);
    // Get the rest
    $two = substr($output, $pos, (strlen($output) - $pos));
    // Extract all tags from the last bit
    preg_match_all('/<(.*?)>/s', $two, $tags);
    // Add suffix if needed
    if (strlen($text) > $length) { $one .= $suffix; }
    // Re-attach tags
    $output = $one . implode($tags[0]);

    //added to remove  unnecessary closure
    $output = str_replace('</!-->','',$output); 

    return $output;
}
?>

如何删除此通知.. 请帮助。我正在使用 WampServer 2.4。 此通知不会在旧版本和 linux 主机中显示。但是新的 wampserver 会显示此通知。 提前谢谢...

【问题讨论】:

  • 一般提示:如果您发布一堵代码墙并在 is 处输入行号,请指出该行在哪里。不要强迫我们手动计算行数。同样,不要使用正则表达式来解析 html。你最终会遇到像这样可怕的怪物。改用 DOM。
  • “只有变量应该在第 27 行的 get_id.php 中通过引用传递” - 我想这与 wampserver 无关。我想重要的是 php 版本。

标签: php variables reference standards strict


【解决方案1】:

end() 需要一个引用,因为它改变了内部数组值指针

【讨论】:

    【解决方案2】:

    这里有很多类似的问题。

    end 期望它的参数是通过引用传递的,并且只有变量可以通过引用传递(不是另一个函数的返回值,比如你的情况下的 preg_split)

    最简单的解决方案应该是将调用拆分为单独的行,例如

    $splitted = preg_split('/<.*>| /', $output, -1, PREG_SPLIT_OFFSET_CAPTURE);
    $last_item = end($splitted);
    $very_last_item = end($last_item);
    

    或者,如果你有时间和东西,重做这个函数,这样你就不必 end() 调用 (对不起,我有点无法在这里完成你想要完成的任务)

    【讨论】:

    • 感谢它的工作非常感谢..这是我的第一个问题。你们都很快解决了这个问题非常感谢...
    最近更新 更多