正则表达式:如何匹配任何字符串,直到空格,或直到标点后跟空格?

Nic*_*wen 8 php regex url

我正在尝试编写一个正则表达式,它将在纯文本字符串中找到URL,以便我可以用锚标记包装它们.我知道已有表达式可用于此,但我想创建自己的表达式,主要是因为我想知道它是如何工作的.

如果我的正则表达式失败,它不会破坏任何东西,我的计划是写一些相当简单的东西.到目前为止,这意味着:1)在单词的开头匹配"www"或"http"2)保持匹配直到单词结束.

我能做到这一点,AFAICT.我有这个:\b(http|www).?[^\s]+

哪个适用于foo www.example.com bar http://www.example.com

问题是,如果我给它,foo www.example.com, http://www.example.com它认为逗号是URL的一部分.

因此,如果我要使用一个表达式来执行此操作,我需要更改"...当你看到空格时停止"到"......当你在空白之前看到空格或一个标点符号时停止".这是我不知道该怎么办.

目前,我正在考虑运行的解决方案是添加另一个测试 - 匹配URL,然后在下一行移动任何偷偷摸摸的标点符号.这不是那么优雅.

注意:我是用PHP编写的.

旁白:为什么更换\s\b在表达上述似乎没有工作?


ETA:

感谢大家!

根据Explosion Pills的建议,这是我最终得到的结果:

function add_links( $string ) {
    function replace( $arr ) {
        if ( strncmp( "http", $arr[1], 4) == 0 ) {
            return "<a href=$arr[1]>$arr[1]</a>$arr[2]$arr[3]";
        } else {
            return "<a href=" . "http://" . $arr[1] . ">$arr[1]</a>$arr[2]$arr[3]";
        }
    }
return preg_replace_callback( '/\b((?:http|www).+?)((?!\/)[\p{P}]+)?(\s|$)/x', replace, $string );
}
Run Code Online (Sandbox Code Playgroud)

我添加了一个回调,以便所有链接都以http://开头,并且做了一些摆弄处理标点符号的方法.

它可能不是最好的做事方式,但它有效.我在最后一段时间里学到了很多东西,但还有更多要学习的东西!

Exp*_*lls 10

preg_replace('/
    \b       # Initial word boundary
    (        # Start capture
    (?:      # Non-capture group
    http|www # http or www (alternation)
    )        # end group
    .+?      # reluctant match for at least one character until...
    )        # End capture
    (        # Start capture
    [,.]+    # ...one or more of either a comma or period.
             # add more punctuation as needed
    )?       # End optional capture
    (\s|$) # Followed by either a space character or end of string
    /x', '<a href="\1">\1</a>\2\3'
Run Code Online (Sandbox Code Playgroud)

......可能就是你想要的.我认为它仍然不完美,但它至少应该满足您的需求.

旁白:我认为这也是因为\b匹配标点符号

  • 这是解释正则表达式的好方法! (2认同)