【问题标题】:php newbie problem: regex [duplicate]php新手问题:正则表达式[重复]
【发布时间】:2011-03-31 08:16:22
【问题描述】:

对不起,我已经提出了这个要求,但还没有找到解决方案:( 这是我的字符串:(你可以看到它有换行符)

Webname:    [webname]
Username:   [username]
IP:     [IP]

我需要读出方括号内的值。 这是我的代码:

    $pattern = '/\[(.|\n)+?\]/'; // i've used the same syntax for my asp projects, always worked
    preg_match($pattern, $txt, $matches, PREG_OFFSET_CAPTURE);
    echo "matches:".count($matches)."\n\n";
    foreach ($matches as $match) 
    {
        echo $match[0]."\n";
    }

我只得到 2 个匹配项:[webname]e (???) 我一直在摆弄这个几个小时,却找不到问题所在..

有什么想法吗? 谢谢

【问题讨论】:

    标签: php regex line-breaks


    【解决方案1】:

    看起来比它必须的要复杂。换行在这里不起作用。

    $pattern = '/\[(.+?)\]/';
    preg_match_all($pattern, $txt, $matches);
    
    print_r($matches);
    

    给予

    Array
    (
        [0] => Array
            (
                [0] => [webname]
                [1] => [username]
                [2] => [IP]
            )
    
        [1] => Array
            (
                [0] => webname
                [1] => username
                [2] => IP
            )
    
    )
    

    所以值将在$matches[1] 中。如果您想要包含括号 ($matches[0]) 的值,也可以省略模式中的括号。

    【讨论】:

      【解决方案2】:

      第一个捕获组,在您的情况下只有一个,位于$matches[1]

      【讨论】:

        【解决方案3】:

        试试类似的东西

        $pattern = '/\[([^\]]+)\]/';
        

        并使用 preg_match_all() 获取所有匹配项。

        【讨论】:

          【解决方案4】:

          试试这个

          $values = array();
          
          foreach (explode("\n", $text) as $line) {
              if (preg_match('/([^:]++):[^\s]*+(.*+)/', $line, $match)) {
                  $values[$match[1]] = $match[2];
              }
          }
          
          var_dump($values);
          

          【讨论】:

          • 你的意思是+? 吗?或者++ 应该是什么意思?
          • 它是一个所有格量词。没有回溯,因此它比 +? 更快。你可以阅读更多关于它here
          • 有趣,我不知道......但似乎 PHP 不能很好地处理它。例如。如果我将?+ 交换,我将不再匹配。顺便说一句,您的代码缺少 ) 并产生一个空数组。至少在我的系统上......你测试过你的代码吗?
          • @Felix 谢谢,现在应该修复了
          猜你喜欢
          • 1970-01-01
          • 2011-01-07
          • 2011-11-14
          • 1970-01-01
          • 2011-10-17
          • 2017-03-18
          • 2011-11-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多