Php preg_替换捕获组检查

Php preg_替换捕获组检查,php,regex,preg-replace,Php,Regex,Preg Replace,我正在尝试向phpfusion应用程序添加一个新的bbcode。我正在使用preg_替换。代码如下: $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

我正在尝试向phpfusion应用程序添加一个新的bbcode。我正在使用preg_替换。代码如下:

$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
);
$text=preg\u replace(
“#\[gameimg(float:(左|中|右))?\]((http | ftp | https | ftps):/)(.*?)(\((jpg | jpeg | gif | png | jpg | gif | png))\[/gameimg\],
“'0''$3”:BASEDIR.GAMESDIR)
“$5$6\”alt=\“$5$6\”style=\”边框:0px;最大宽度:350px;\“/>”,
$text
);
如果我提供一个绝对url(例如[gameimg]http://localhost/dirname/file.jpg[/gameimg])一切正常,图片按预期显示。但是如果我使用相对url([gameimg]dirname/file.jpg[/gameimg])忽略protokol和主机名我希望将basedir.gamedir常量附加到给定的url,但它根本不起作用,它不需要任何替换就打印出原始bbcode,而不是图像。我做错了什么?

这里有几件事:

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

    ((http | ftp | https | ftps)://)?

    • 这里有几件事:

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

        ((http | ftp | https | ftps)://)?