2

我现在已经搜索了很多,但在我的情况下我找不到任何建议。我已经看到负前瞻或环顾的成功,但我真的不明白。

我希望使用 RegExp 在文本块中查找 URL,但在引用时忽略它们。虽然还不完美,但我有以下查找 URL:

(https?\://)?(\w+\.)+\w{2,}(:[0-9])?\/?((/?\w+)+)?(\.\w+)?

我希望它匹配以下内容:

www.test.com:50/stuff
http://player.vimeo.com/video/63317960
odd.name.amazone.com/pizza

但不匹配:

"www.test.com:50/stuff
http://plAyerz.vimeo.com/video/63317960"
"odd.name.amazone.com/pizza"

编辑:

为了澄清,我可以通过表达式传递整段文本。我想要的示例段落如下:

我希望找到以下链接www.example.com。然而,这个链接应该被忽略"www.example.com"。也可以忽略“www.example.comwww.example.com”会很好,但不是必需的。

我在下面工作的另一个示例。语言是php:

$articleEntry = "Hey guys! Check out this cool video on Vimeo: player.vimeo.com/video/63317960";

$pattern = array('/\n+/', '/(https?\:\/\/)?(player\.vimeo\.com\/video\/[0-9]+)/');
                    
$replace = array('<br/><br/>',
    '<iframe src="http://$2?color=40cc20" width="500" height="281" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>'); 
    $articleEntry = preg_replace($pattern,$replace,$articleEntry);

上述结果将用双中断“

”替换任何新行“\n”,并将通过用 iframe 和链接替换 ​​Vimeo 地址来嵌入 Vimeo 视频。

4

2 回答 2

2

我找到了解决方案!

(?=(([^"]+"){2})*[^"]*$)((https?:\/\/)?(\w+\.)+\w{2,}(:[0-9]+)?((\/\w+)+(\.\w+)?)?\/?)

从 (? 到 *$) 的第一部分是什么使它对我有用。我在 java Regex 中发现这是一个答案- 拆分但忽略引号内的文本?通过https://stackoverflow.com/users/548225/anubhava

虽然我之前读过这个问题,但我忽略了他的回答,因为它不是“解决”问题的那个。我只是将单引号更改为双引号,它对我有用。

于 2013-08-18T09:05:03.997 回答
0

添加^$到您的正则表达式

 ^(https?\://)?(\w+\.)+\w{2,}(:[0-9])?\/?((/?\w+)+)?(\.\w+)?$

请注意,您可能需要在 http 之后转义斜杠(含义https?\:\/\/

更新

如果您希望它区分大小写,则不应使用\wbut [a-z]。\w 包含所有字母和数字,因此在使用时应小心。

于 2013-08-07T12:39:18.993 回答