正则表达式匹配字符串中的所有关键字

时间:2016-07-28 16:05:30

标签: javascript regex

正则表达式中的noob我需要来自社区的一些支持

假设我有这个字符串 str

  
      
  1. www.anysite.com hello demo试试此链接

  2.   
  3. anysite.com确实是演示链接

  4.   
  5. http://www.anysite.com另一个

  6.   
  7. www.anysite.com

  8.   
  9. http://anysite.com

  10.   

将1-5视为整个字符串 str 此处

我想转换所有' anysite.com'到我正在使用的可点击的html链接:

str =  str.replace(/((http|https|ftp):\/\/[\w?=&.\/-;#~%-]+(?![\w\s?&.\/;#~%"=-]*>))/g, '<a href="$1" target="_blank">$1</a>');

这会将以http / https / ftp开头的所有以空格分隔的单词转换为

链接
<a href="url" target="_blank">url</a>

因此,行 3 和行 5 已正确转换。现在将所有www.anysite.com转换为我再次使用的链接

str = str.replace(/(\b^(http|https|ftp)?(www\.)[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig, '<a href="https://$1" target="_blank">$1</a>');

虽然只有在 str 的开头才能找到www.anysite.com才会转换成链接。因此,它会将行号 1 转换为行号 4

  

请注意,我使用了^(http | https | ftp)?(www。)查找所有www没有   以http / https / ftp开头,至于http已经存在   转化

也是行号 2 的链接,它既不以http也不是www开头,而是以.com结尾,正则表达式将如何。

作为参考,您可以尝试将整个字符串发布到您的Facebook时间线,它将所有五行转换为链接。检查快照

enter image description here

2 个答案:

答案 0 :(得分:3)

感谢您的帮助,帮助我的最终RegEx是:

//remove all http:// and https://
str = str.replace(/(http|https):\/\//ig, "");

//replace all string ending with .com or .in only into link
str = str.replace( /((www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.(com|in))/ig, '<a href="//$1" target="_blank">$1</a>');

我使用.com和.in作为我的具体要求,否则此http://regexr.com/39i0i上的解决方案将起作用

  

虽然有问题,但它没有将缩短的网址转换为   链接完美。例如http://s.ly/qhdfTyuiOP将链接到s.ly

还有什么建议吗?

答案 1 :(得分:0)

^(http|https|ftp)?(www\.)并不代表&#34;所有www都不以http / https / ftp&#34;开头而是#34;一个字符串,以可选的http/https/ftp开头,后跟www.

实际上,^在这个上下文中并不是一个否定,而是一个表示字符串开头的锚点。我想你用这种方式是因为它在字符类([^...])中使用时的含义;这是相当棘手的,因为它的含义会根据它所在的上下文而改变。

你可以删除它,你应该没问题,因为我认为没有必要确保字符串不以http/https/ftp开头(你之前转换了那些事件,应该没有剩下的)。

编辑:我提到了后卫,但忘了它在JS中不可用......

如果你想做出某种否定,最简单的方法就是使用负面的背后隐藏:

(?<!http|https|ftp)www\.

这匹配&#34; www。&#34;只有当它没有http,https或ftp。

之前