如何在PHP正则表达式中包含新行

时间:2017-09-30 12:49:37

标签: php regex preg-match

我有一个读取文本文件的php脚本。此文本文件如下所示。

09/27/17 
3:00p  
sam1, 
sam  
15 
(999) 
999-9999
M:(888) 
888-8888 
17  
09/27/17  
3:30p   
mark1, 
marke  
asd
15 
(777) 
777-7777 
M:(666) 
666-6666 
17 

我需要做的是提取电话号码,但问题是电话号码分为两行,如你所见

我的PHP脚本:

    $string = ""; 
    $date=array();
    $data1 = file("data.txt"); 
    for($i =0; $i < count($data1);$i++)
 { 
    $data = explode(" ",$data1[$i]); 
    $line = $data[0]; 
    //$string .=$line; 

    if (preg_match('^[M:]\([0-9]{3}\)[0-9]{3}-[0-9]{4}/s^',$line)) {
        $string .= $line."\n"; 
    }

    if (preg_match('^\([0-9]{3}\)[0-9]{3}-[0-9]{4}/s^',$line)) {
        $string .= $line."\n"; 
    }

 }

我需要它是这样的:

   (999)999-9999,M:(888)888-8888  
   (777)777-7777,M:(666)666-6666 

但由于正则表达式无效,我没有得到任何结果

实现这一目标的正确正则表达方式是什么?谢谢

1 个答案:

答案 0 :(得分:1)

试试这个正则表达式。可以通过连接每个匹配的Group1和Group2中存在的内容来形成所需的移动号码。

^((?:M:)?\(\d{3}\))\s*(\d{3}-\d{4})

Click for Demo

<强>解释

  • ((?:M:)?\(\d{3}\)) - 捕获第1组
    • (?:M:)? - 匹配字母M
    • 的0或1次出现
    • \( - 按字面意思匹配(
    • \d{3} - 匹配3位数字
    • \) - 按字面意思匹配)
  • \s* - 匹配0个或更多空白字符
  • (\d{3}-\d{4}) - 第二个捕获组,其中包含3位数的序列,后跟-,后跟另外4位数字

<强> Click here to see the Code and Output

enter image description here