1

我看到了一些关于此的帖子,但它们是针对 PHP 的(我需要 JavaScript(实际上是 ActionScript(...因为 ActionScript 扩展了 JavaScript)))所以我的问题是如何只捕获逗号、句点、问号或感叹号.

这是我目前所拥有的

instructionText.replace(/(https?:\/\/\w.*[\w])/gi, "<a href='$1' target='_blank'>$1</a>");

但是当我使用文本“访问http://www.google.com .Hello world”时,它捕获了 hello world 部分。

上面捕获组的结果是“http://google.com.Hello world”。显然,我不想要 URL 之后的任何内容。它们应该是简单的 URL。

主要是,我只想为这些“.,!?”中的任何一个添加一个检查。或空格字符并结束捕获组。它不一定是完美的。

顺便说一句,不确定您是否需要先测试 RegEx,但如果没有,您可以使用RegExr

4

5 回答 5

2

假设 url 中没有空格,后面有空格或字符串结尾:

instructionText.replace( /(https?:\/\/\S+?)(?=[.,!?]?(\s|$))/g, "<a href='$1' target='_blank'>$1</a>" );

它尽可能少地捕获 'http[s]://' 和非空格字符,直到向前看,可以选择其中一个.,!?,然后是空格或字符串结尾。

于 2013-01-15T19:31:14.093 回答
0
https?\:\/\/((www\\.)?\w*?(\\.\w{2,7})+)(?=\\.|\\,|\\?|\\!|\s)

我想(?=\\.|\\,|\\?|\\!|\s)这是你要找的部分?

于 2013-01-15T19:53:23.473 回答
0

问题是您正在捕获.*后跟 a \w,这意味着任何数量的任何内容后跟一个单词...

/(https?:\/\/\w.*[\w])/

你需要让你的通配符捕获不贪婪......

/(https?:\/\/\w.*?[\w])/

所以它会在捕获之前捕获尽可能少的字符\w


编辑:更多信息

此外,您的正则表达式非常简单,不幸的是,捕获 url 非常复杂,因为有效和无效的变化太多。您需要为自己设置一条清晰的界限,在其中定义您认为与您的上下文中的 url 匹配的内容。

例如,如果您想确保有效的顶级域,则必须包含类似这样的内容...

/https?:\/\/\w.*?\.(com|org|co\.uk| ... etc ... )/

一旦注册了新的顶级域,它就会过时。

如果你想匹配以协议开头的任何内容,直到下一个空格,这样的事情应该做......

/[a-zA-Z]+:\/\/\S+/

祝你好运!

于 2013-01-15T17:10:31.623 回答
0

在您的正则表达式中,您正在寻找尽可能多的字符(.* 是贪婪的),其中最后一个字符是 \w 字符。试试这个(快速编辑你的正则表达式)。它应该适用于存在或不存在的www.域,以及具有两个或三个字母 tld 的域。

https?\:\/\/(www\.)?\w*?\.\w{2,3}(?=[\W])
于 2013-01-15T17:10:47.653 回答
0

感谢@MikeM的回答,我能够使用他的并生成处理来替换链接和电子邮件地址(仅在不存在链接的情况下),省略标点符号,如果其他人需要,请在此处参考:

/**
 * Replace URLs and Emails with HTML links
 *
 * This function will replace all URLs and Email Addresses wrapped in HTML links, ONLY if one does not already exist,
 * excluding punctuation (email or url followed by period, comma, etc).
 *
 * @param $content
 *
 * @return string
 * @since 1.0.0
 *
 */
function replace_links( $content ) {

    $content = preg_replace( '"<a[^>]+>.+?</a>(*SKIP)(*FAIL)|(https?:\/\/\S+?)(?=[.,!?]?(\s|$))"', '<a href="$0">$0</a>', $content );
    $content = preg_replace( '"<a[^>]+>.+?</a>(*SKIP)(*FAIL)|(\S+@\S+\.\S+?)(?=[.,!?]?(\s|$))"', '<a href="mailto:$0">$0</a>', $content );

    return $content;
}

查看最新的要点: https ://gist.github.com/tripflex/0cc930c2afe5f4c73f2aed61cedf95d0

于 2022-02-02T00:37:35.430 回答