1

我有 html/文本字符串,并希望将文本的所有类似链接的部分与带有 A 标签的真实超链接相匹配。对于这个问题,我正在尝试匹配“www.somesite.domen”模式。但是,如果模式接近句尾的标点符号怎么办。

如何匹配没有标点符号的最后一个字符的模式?

  1. www.somesite.domen。
  2. www.somesite.domen,
  3. www.somesite.domen?
  4. www.somesite.domen!
  5. www.somesite.domen/?id=1?

这是我正在使用的功能:

function make_links($text)
{
  return  preg_replace(
     array(
        '/(^|\s)(www\.[^<>\s!,]+)(!$|\s|\.|\:|\!|,|\?)/iex'
       ),
     array(
        "stripslashes((strlen('\\2')>0?'\\1<a target=\"_blank\" href=\"http://\\2\">\\2</a>\\3':'\\0'))"
       ),
       $text
   );
}

但是当'.' 或者 '?' 字符是句子中的最后一个,我的功能也将它们带入链接。

知道如何解决这种情况吗?谢谢!

4

1 回答 1

0

如果我正确理解您的要求,您需要将您的文本行分成 3 组

  • 第一组将在主机名之前保留文本
  • 第二组将保留主机名
  • 第三组将最后一个标点字符(或空白字符)。

解决方案之一可能如下:

/^(.*?)(www(?:.\w+)+(?:\/[^.\s]+?))(!$|\s|\.|\:|\!|,|\?)?$/

正则表达式解释

使用some text www.host.some-site.domen/?id=1?作为示例,您将获得如下匹配:

匹配结果

为了摆弄你的正则表达式,你可以使用regex101.com

编辑

或者,这是另一个正则表达式。

/^(.+\s)?(\w+(?:\.[-\w]+)+\.\w+(?:\/.*?)?)(!$|\s|\.|\:|\!|,|\?)?$/

我进行了几次测试:

  • 测试文本:some stuff www.host.somesite.domen/?id=1.。匹配组:

    • 1 some stuff:,
    • 2 www.host.somesite.domen/?id=1:,
    • 3:.
  • 测试文本:some stuff www.host.somesite.domain.。匹配组:

    • 1:some stuff
    • 2:www.host.somesite.domen
    • 3:.
  • 测试文本:www.host.somesite.domain。匹配组(只有一个):

    • 2:www.host.somesite.domain
  • 测试文本:hello www.host.somesite.domen/mysite.。匹配组:

    • 1 hello:,
    • 2 www.host.somesite.domen/mysite:,
    • 3:.
  • 测试文本:www.somesite.domen/?id=1?。匹配组:

    • 2:www.somesite.domen/?id=1
    • 3:?

我希望这将有助于解决您的问题。

于 2013-01-16T11:39:22.687 回答