0

我的一对功能存在问题,这些功能允许用户使用 [link] 和 [/link] 集在没有事先 html 知识的情况下创建链接。一切都很好,直到我开始测试链接前后的空格等意外情况。现在它在我的服务器上超时,设置为 30 秒的最大处理时间。

用户总共可以输入 5000 个字符,这是这些功能必须浏览的健康页面。但是,当用户正确键入代码(不带空格)时,它不会对服务器征税,并且我的页面会在几分之一秒内弹出,就像它应该的那样。如果缺少 [link] [/link] 之一,则 while 循环退出 - 没有任何反应。只有在链接中键入这样的空格时:

[链接] www.google.com[/link] --或-- [链接]www.google.com [/link]

两者都使服务器超时并出现此错误(路径稍作修改):

致命错误:/home/example/thiscode.php 第 18 行的最大执行时间超过 30 秒

[link]www.google.com[/link] 不会超时,也不会:[link]www. google.com[/link] 根本不会被识别为有效的 html 链接,但会正确放置锚标记。

有什么想法吗?代码哈!

function my_link($snip)
{

    // Locate '[link]'
    $pos = stripos($snip, '[link]');

    // Strips off everything before [link]
    $str = substr($snip, $pos);

    // Removes [link] from $str
    $str = substr($str, 6);

    // Trim off any accidental whitespace BEFORE the link
    $str = ltrim($str);

    // Locate the end delimiter '[/link]'
    $pos_2 = stripos($str, '[/link]');

    // Cut off everything after and including '[/link]'
    $str = substr($str, 0, $pos_2);

    // Trim any accidental whitespace AFTER the link
    $str = rtrim($str);

    // Construct valid HTML link using content given
    if(strpos($str, 'http://') === FALSE) {
        $link = '<a href="http://'.$str.'">'.$str.'</a>';
    }else{
        $link = '<a href="'.$str.'">'.$str.'</a>';
    }

    // Replace the old [link]content[/link] with our newly constructed link
    $new_input = str_replace('[link]'.$str.'[/link]', $link, $snip);

    return $new_input;

}

function making_links($input)
{

    // Loop through $input as many times as [link] & [/link] pairs occur
    while(strpos($input, '[link]') && strpos($input, '[/link]')) {

        $input = my_link($input);

    }

    return $input;

}

提前感谢任何可以帮助我的人!

4

3 回答 3

1

您可以尝试这样的事情,但是考虑到适当大的文本块,它可能会遇到性能问题。不能比你所拥有的更糟糕了

$input = preg_replace('@\[link\]\s*(https?://)?(.+?)\s*\[/link\]@i', '<a href="http://$2">$2</a>', $input);

要获得更强大的解决方案,您应该研究词法分析

于 2011-05-04T04:54:36.010 回答
1

您的代码中有一些逻辑错误。例如,直到(但不包括)str_replace 之前的所有代码都允许这些变化:

  • [链接]http://...[/LINK]
  • [链接] www.example.com [/链接]
  • [链接]example.com[/链接]

但是您的 str_replace 不允许使用不同的标签大小写,并且它不允许前导/结束空格,因为这些空格已从 $str 中剥离。在上述所有情况下, str_replace 不会替换任何内容。在第二个示例中,您的代码将陷入无限循环。

使用 Phil 所示的正则表达式。这是迄今为止解决您的问题的最简单方法。

于 2011-05-04T05:17:48.357 回答
1

PECL BBCode可能是您的一个选择。除此之外,您的代码的问题显然出在循环上。具体来说,如果有前导或尾随空格,则不会从字符串中删除 [link] 或 [/link]。

您的具体问题是由这一行引起的:$new_input = str_replace('[link]'.$str.'[/link]', $link, $snip);

因为您正在更新字符串以删除空格,[link]'.$str.'[/link]所以原始代码段中不存在,只有带有空格的表单存在。因此,它永远找不到。为了解决这个问题,最好对原始字符串进行处理。

另一个建议:更改strpos($input, '[link]')strpos($input, '[link]') === FALSE. 否则,如果输入以[link]

于 2011-05-04T05:22:31.467 回答