PHP正则表达式URL解析问题预替换

PHP正则表达式URL解析问题预替换,php,regex,preg-replace,Php,Regex,Preg Replace,我有一个定制的标记解析函数,多年来一直运行良好。我最近发现了一个我以前没有注意到的错误,我一直无法修复它。如果有人能帮我,那就太棒了。因此,我有一个定制的论坛和基于文本的MMORPG,每个输入都经过清理和解析,以获得类似bbcode的标记。它还将解析出URL,并将它们转换为合法链接,这些链接会转到一个退出页面,并声明您将离开该站点。。。所以我遇到的问题是,当我的用户在一个文本框中发布多个URL时(比如说\n分隔),它只会将其他URL转换为链接。以下是URL的解析器: $markup = preg

我有一个定制的标记解析函数,多年来一直运行良好。我最近发现了一个我以前没有注意到的错误,我一直无法修复它。如果有人能帮我,那就太棒了。因此,我有一个定制的论坛和基于文本的MMORPG,每个输入都经过清理和解析,以获得类似bbcode的标记。它还将解析出URL,并将它们转换为合法链接,这些链接会转到一个退出页面,并声明您将离开该站点。。。所以我遇到的问题是,当我的用户在一个文本框中发布多个URL时(比如说\n分隔),它只会将其他URL转换为链接。以下是URL的解析器:

$markup = preg_replace("/(^|[^=\"\/])\b((\w+:\/\/|www\.)[^\s<]+)" . "((\W+|\b)([\s<]|$))/ei", '"$1<a href=\"out.php?".shortURL("$2")."\" target=\"_blank\">".shortURL("$2")."</a>$4"', $markup);
示例输出:

<a href="out.php?http://skylnk.co/tRRTnb" target="_blank">http://skylnk.co/tRRTnb</a>
<br>http://skylnk.co/hkIJBT
<br><a href="out.php?http://skylnk.co/vUMGQo" target="_blank">http://skylnk.co/vUMGQo</a> 
<br>http://skylnk.co/USOLfW 
<br><a href="out.php?http://skylnk.co/BPlaJl" target="_blank">http://skylnk.co/BPlaJl</a> 
<br>http://skylnk.co/tqcPbL
<br><a href="out.php?http://skylnk.co/jJTjRs" target="_blank">http://skylnk.co/jJTjRs</a>
<br>http://skylnk.co/itmhJs
<br><a href="out.php?http://skylnk.co/llUBAR" target="_blank">http://skylnk.co/llUBAR</a>
<br>http://skylnk.co/XDJZxD
<br>


http://skylnk.co/hkIJBT

http://skylnk.co/USOLfW

http://skylnk.co/tqcPbL

http://skylnk.co/itmhJs

http://skylnk.co/XDJZxD

e
替换前的标志是。您可以使用访问相同的功能

i
标志在这里是无用的,因为
\w
已经匹配了大写和小写,并且在您的模式中没有反向引用

我设置了
m
标志,使
^
$
匹配一行的开头和结尾,而不是整个字符串的开头和结尾。这应该可以解决你每隔一行匹配一次的奇怪问题

我还将一些组设置为非捕获
(?:模式)
——因为较大的捕获组已经捕获了文本

下面的代码未经测试。我只在正则表达式测试器上测试正则表达式

preg_replace_callback(
    "/(^|[^=\"\/])\b((?:\w+:\/\/|www\.)[^\s<]+)((?:\W+|\b)(?:[\s<]|$))/m",
    function ($m) {
        return "$m[1]<a href=\"out.php?".shortURL($m[2])."\" target=\"_blank\">".shortURL($m[2])."</a>$m[3]";
    },
    $markup
);
preg\u replace\u回调(

“/(^ |[^=\”\/])\b((?:\w+:\/\/\/\124; www\)[^\sCan你给出了一个失败的测试用例吗?我现在已经更新了帖子。哇,太棒了。使用正则表达式可以学到很多东西。感谢你的及时回复,并对我的延迟表示歉意。
preg_replace_callback(
    "/(^|[^=\"\/])\b((?:\w+:\/\/|www\.)[^\s<]+)((?:\W+|\b)(?:[\s<]|$))/m",
    function ($m) {
        return "$m[1]<a href=\"out.php?".shortURL($m[2])."\" target=\"_blank\">".shortURL($m[2])."</a>$m[3]";
    },
    $markup
);