代码之家  ›  专栏  ›  技术社区  ›  Alexander

使用具有不同行尾样式的m标志匹配行尾位置

  •  2
  • Alexander  · 技术社区  · 8 年前

    我试着用标记将以“##”开头的每一行包装起来。尝试实现类似GitHub/Stackoverflow的文本格式语法。

    这就是我得到的:

    $value = preg_replace('/^## (.*)$/m', '<p>$1</p>', $value);
    

    示例文本:

    ## Some header 1
    
    Some text that doesn't need to be altered
    
    ## Some header 2
    

    <p>Some header 1
    </p>
    
    Some text that doesn't need to be altered
    
    <p>Some header 2</p>
    

    如您所见,第二个标题处理得很好,因为它位于文本的末尾。然而,第一个标题在结束标记之前的末尾额外增加了一行。我该怎么摆脱它?

    1 回复  |  直到 5 年前
        1
  •  2
  •   Community CDub    5 年前

    在您当前的PCRE设置中,一个点似乎与除LF之外的所有字符匹配( \n ,换行),因此,它与CR匹配( \r ,回车),这也是一个换行符。

    $ 锚定)。使 . 匹配除CR和LF之外的所有字符,打开相应的标志:

    '/(*ANYCRLF)^## (.*)$/m'
      ^^^^^^^^^^
    

    $ \r\n .

    有关此动词和其他动词的更多信息,请访问 rexegg.com :

    默认情况下,在编译PCRE时,当遇到 . dotall mode ),以及 ^ 锚的行为 multiline mode 。您可以使用以下修饰符覆盖此默认值:

    (*CR) 只有回车被视为换行
    (*LF) 只有换行符被认为是换行符(在Unix上)
    (*CRLF)
    (*ANYCRLF)
    (*ANY) 任何Unicode换行序列都被视为换行符

    例如, (*CR)\w+.\w+ 比赛 Line1\nLine2 因为点能够匹配 demo .