【问题标题】:PHP regex multi-linePHP 正则表达式多行
【发布时间】:2025-12-20 11:40:11
【问题描述】:

我有以下 PHP 正则表达式

preg_match('/[\/\/\*] First: (.*)\n[\/\/\*] Second: (.*)\n/i', $some_string)

但由于某种原因,它与此文本不匹配:

// First: a string
// Second: another string

我尝试在 Windows 和 Unix 风格之间更改行尾,但没有任何效果。我还尝试拆分正则表达式以分别匹配 First 和 Second;这行得通,但是当我将它们放在一起时,它们不再与示例文本匹配。这似乎与第二个[\/\/\*].. 之后的空间有关。有什么想法吗?

注意我不能改变正则表达式;这是我反转的客户端代码,因为它们不提供文档。此代码在 PHP 文件中查找特定模式,以便将它们作为“插件”加载到其产品中。真的,我想猜测我需要向这些 PHP 文件添加什么标头,以便正确地将它们识别为插件。

【问题讨论】:

    标签: php regex multiline


    【解决方案1】:

    试试:

    preg_match('~// First: (.*)\n// Second: (.*)~i', $str);
    

    See it

    为什么你的正则表达式错误?

    [\/\/\*] 是一个匹配/* 的字符类。

    但你似乎在字符串的开头有//,所以你将永远不会得到匹配。

    我当前的正则表达式将匹配什么字符串?

    将您当前的输入更改为在开头有一个/,在第二行之后有一个换行符:

    $some_string =
    '/ First: a string
    / Second: another string
    ';
    

    See it

    【讨论】:

    • 我无法更改正则表达式本身,这是我无法修改的客户端代码。我实际上必须想出一个 php 插件的标头,客户端代码将根据此正则表达式规则加载.... :(
    • @Trust:您的正则表达式不正确。如果不改变它,你什么都做不了。
    【解决方案2】:
    $some_string = <<<STR
    // First: a string
    // Second: another string
    
    STR;
    
    $match = preg_match('`// First: (.*)\n// Second: (.*)\n`i', $some_string);
    
    echo $match;
    

    刚刚测试过,它可以工作。你确定第二行后面有换行符吗?

    【讨论】:

      【解决方案3】:

      (代表 OP 发布).

      答案:

      我试图猜测这会匹配什么模式。结果是这样的:

      /*
      * First: a string
      * Second: another string
      */
      

      【讨论】: