【问题标题】:Selecting URLs using RegExp but ignoring them when surrounded by double quotes使用 RegExp 选择 URL,但在用双引号括起来时忽略它们
【发布时间】:2013-08-07 12:26:19
【问题描述】:

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

我希望使用 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”替换为双换行符“

”,并将通过将 Vimeo 地址替换为 iframe 和链接来嵌入 Vimeo 视频。

【问题讨论】:

  • 你用的是什么语言?
  • 在您列出的不匹配 URL 示例中,第一个和第二个 URL 是否存在错误。我只能看到一个报价?
  • 我正在使用 php 的 preg_replace。 @Sniffer我想我想说如果开头,结尾或两者都有报价,我不想要匹配。为了更清楚,我将发布更多代码示例。

标签: regex url quote


【解决方案1】:

我找到了解决办法!

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

从 (? 到 *$) 的第一部分是什么使它对我有用。我在java Regex - split but ignore text inside quotes? by https://stackoverflow.com/users/548225/anubhava 中找到了这个答案

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

【讨论】:

    【解决方案2】:

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

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

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

    更新

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

    【讨论】:

    • 感谢您的快速回复!我之前不是很清楚。我正在传递一段完整的文本,里面有一个 URL。如果我错了,请纠正我,但是锚只会在 URL 周围找到匹配项吗?我确实希望允许区分大小写的 URL。例如,Bit.ly 需要它。到目前为止,我的解析器对转义冒号和斜杠感到满意。但我会记住的。
    • 如果您只想忽略“,添加 ^\”(或 ^“,取决于语言)前后,如果您还想区分大小写(在您的示例中 - 播放器而不是播放器),将 \w 替换为 [a-z]
    • 恐怕我还在为此苦苦挣扎。通过添加 ^\" 或 ^" 它不会匹配任何 URL,无论是否有双引号。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-30
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    • 2013-10-31
    相关资源
    最近更新 更多