Php Regex选择url,但当=直接位于url前面时除外

Php Regex选择url,但当=直接位于url前面时除外,php,regex,Php,Regex,我正在尝试使用正则表达式查找和替换论坛系统中的所有URL。这是可行的,但它也会选择bbcode中的任何内容。这不应该发生 我的代码如下: <?php function make_links_clickable($text){ return preg_replace('!(([^=](f|ht)tp(s)?://)[-a-zA-Zа-яА-Я()0-9@:%_+.~#?&;//=]+)!i', '<a href="$1">$1</a>', $text)

我正在尝试使用正则表达式查找和替换论坛系统中的所有URL。这是可行的,但它也会选择bbcode中的任何内容。这不应该发生

我的代码如下:

<?php
function make_links_clickable($text){
    return preg_replace('!(([^=](f|ht)tp(s)?://)[-a-zA-Zа-яА-Я()0-9@:%_+.~#?&;//=]+)!i', '<a href="$1">$1</a>', $text);
}
//$text = "https://www.mcgamerzone.com<br>http://www.mcgamerzone.com/help/support<br>Just text<br>http://www.google.com/<br><b>More text</b>";
$text = "@Theareak We know this and [b][url=https://www.mcgamerzone.com/news/67/False-positive-proxy-bans-and-bot-attacks]here[/url] [/b]is an explanation, we are trying to fix this asap! https://www.mcgamerzone.com/news/67/False-positive-proxy-bans-and-bot-attacks aaa";
echo "<b>Unparsed text:</b><br>";
echo $text;
echo "<br><br>";
echo "<b>Parsed text:</b><br>";
echo make_links_clickable($text);
?>
bb代码中出现的所有URL都是在=字符后面,这意味着我不希望选择任何以=开头的URL

我基本上有这样的功能,但这会导致在应该选择的字符串前面额外选择一个字符

我对正则表达式不是很熟悉。我的代码的最终输出如下:

您可以像这样匹配和跳过[url=…]:

\[url=[^\]]*](*SKIP)(?!)|(((f|ht)tps?://)[-a-zA-Zа-яёЁА-Я()0-9@:%_+.\~#?&;/=]+)

这样,您将只匹配[url=…]标记之外的url

:


你可以用消极的后视吗?而不是你的否定类。它断言将要匹配的内容之前没有任何内容


与其使用否定类,不如使用否定的lookback?可以这样做。@Aaron你能给我举个例子吗?你可以试试f|https?:/[-a-zA-Zа-a-zA-Zаa-0-9@:%\+.\~&/=]+?![^\]]*]我不太熟悉PHP正则表达式,这就是为什么我没有给出答案的原因,但我将举一个例子,也不要忘记对整个URL进行分组。还有,s不需要分组吗?谢谢你的PHP示例,我会改变我的。你想解释一下为什么你应该把整个url分组吗?难道不可能检索整个匹配项吗?这种方法只是有助于避免在a=之后匹配url,而不是在[url=…]标记之外。哦,是的,可以使用0分组。我更喜欢定义我的分组内容。但这将适用于$0,并且不需要额外的分组。
\[url=[^\]]*](*SKIP)(?!)|(((f|ht)tps?://)[-a-zA-Zа-яёЁА-Я()0-9@:%_+.\~#?&;/=]+)
function make_links_clickable($text){
    return preg_replace('~\[url=[^\]]*](*SKIP)(?!)|(((f|ht)tps?://)[-a-zA-Zа-яёЁА-Я()0-9@:%_+.\~#?&;/=]+)~iu', '<a href="$1">$1</a>', $text);
}
$text = "@Theareak We know this and [b][url=https://www.mcgamerzone.com/news/67/False-positive-proxy-bans-and-bot-attacks]here[/url] [/b]is an explanation, we are trying to fix this asap! https://www.mcgamerzone.com/news/67/False-positive-proxy-bans-and-bot-attacks aaa";
echo "<b>Parsed text:</b><br>";
echo make_links_clickable($text);