preg_replace捕获组检查

时间:2011-09-25 01:05:45

标签: php regex preg-replace

我正在尝试将新的bbcode添加到我的phpfusion应用程序中。我和preg_replace一起使用。这是代码:

$text = preg_replace(
    "#\[gameimg( float:(left|center|right))?\]((http|ftp|https|ftps)://)(.*?)(\.(jpg|jpeg|gif|png|JPG|JPEG|GIF|PNG))\[/gameimg\]#sie",
    "'<span style=\"display: block; max-width: 350px; margin: 0 0 5px 5px; $1\"><img src=\"'
        . (strlen('$3') > 0 ? '$3' : BASEDIR.GAMESDIR)
        . '$5$6\" alt=\"$5$6\" style=\"border:0px; max-width: 350px;\" /></span>'",
    $text
);

如果我提供绝对网址(例如[gameimg] http://localhost/dirname/file.jpg [/ gameimg]),一切正常,图片按预期显示。但是如果我使用相对url([gameimg] dirname / file.jpg [/ gameimg])省略protokol和hostname,我希望将basedir.gamedir常量附加到给定的url但它根本不起作用,它打印出来没有任何替换的原始bbcode,而不是图像。我做错了什么?

1 个答案:

答案 0 :(得分:3)

这里有几件事:

  • 这是一个巨大的preg_replace电话。也许你可以将这个问题分解成更小的部分,以便更容易理解/维护?
  • 您正在使用“忽略大小写”修饰符(i),但您有(jpg|JPG)之类的内容。这是多余的。
  • 您的问题询问为什么没有[gameimg]的{​​{1}}代码无法匹配。这是因为你的正则表达式中需要http://..。您应该通过添加((http|ftp|https|ftps)://)来使此部分成为可选项,如下所示:

    ?