Php 不带最后一个puntuaction字符的类正则表达式链接匹配

Php 不带最后一个puntuaction字符的类正则表达式链接匹配,php,regex,Php,Regex,我有html/文本字符串,希望将所有链接(如部分文本)匹配到带有标记的真实超链接。对于这个问题,我试图匹配“www.somesite.domen”模式。但是,如果模式接近句子末尾的标点符号,该怎么办 如何匹配没有最后一个字符(标点符号)的模式? www.somesite.domen www.somesite.domen www.somesite.domen www.somesite.domen www.somesite.domen/?id=1 以下是我正在使用的函数: function make

我有html/文本字符串,希望将所有链接(如部分文本)匹配到带有标记的真实超链接。对于这个问题,我试图匹配“www.somesite.domen”模式。但是,如果模式接近句子末尾的标点符号,该怎么办

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

  • www.somesite.domen
  • www.somesite.domen
  • www.somesite.domen
  • www.somesite.domen
  • 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
       );
    }
    
    函数生成链接($text)
    {
    返回预更换(
    排列(
    “/(^\s)(www\.[^\s!,]+)(!$\s\.:。!\124;\.,?)/iex”
    ),
    排列(
    “带斜杠((strlen('\\2'>0?'\\1\\3':'\\0'))”
    ),
    $text
    );
    }
    
    但是当“.”或“?”字符是句子中的最后一个字符时,我的功能是将它们也带到链接中


    你知道怎么解决这个案子吗?谢谢

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

    • 第一组将在主机名之前保留文本
    • 第二组将保留主机名
    • 第三组是最后一个标点字符(或空白字符)
    其中一个解决方案可以是:

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

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

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

    为了摆弄您的regexp,您可以使用

    编辑

    或者,这是另一个regexp

    /^(.+\s)?(\w+(?:\.[-\w]+)+\.\w+(?:\/.*?)?)(!$|\s|\.|\:|\!|,|\?)?$/
    
    我已经进行了几个测试:

    • 测试文本:
      一些东西www.host.somesite.domen/?id=1。
      。匹配组:

      • 1:
        一些东西
      • 2:
        www.host.somesite.domen/?id=1
      • 3:
    • 测试文本:
      一些东西www.host.somesite.domain.
      。匹配组:

      • 1:
        一些东西
      • 2:
        www.host.somesite.domen
      • 3:
    • 测试文本:
      www.host.somesite.domain
      。匹配组(仅一个):

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

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

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

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

    您的文本是否包含界定域的
    []
    ?我的文本不包含
    []
    。另请参见,抱歉,
    []
    不是文本的一部分。我刚刚从案例中删除了它们。@Branislav,那么主机名呢,它总是www吗?在这个问题中,链接总是以www开头。因此,我必须尽可能多地匹配案例,但结尾没有标点符号。主机名也很受欢迎。正如您所知,“.”和“?”可以在URL中,但不能在最后。示例:“这是我的网站URL www.hostname.com/mysite。”