PHP preg_match_all:提取特定行

时间:2014-11-26 16:21:01

标签: php regex curl preg-match preg-match-all

我有问题。我需要得到这样的页面的一些行:

Text text text ...

Porto-Portugal-May-2013
Barcelona-Spain-April-2013

Text text text text text ...

Madrid-Spain-April-2013

Text text text ...

我需要过滤器,以便只显示以下内容:

Porto-Portugal-May-2013
Barcelona-Spain-April-2013
Madrid-Spain-April-2013

(带有3个破折号的行)

可以使用preg_match_all或其他功能吗?

我使用cURL来获取页面内容。

我试过了:

$body = " Text text text ...

Porto-Portugal-May-2013
Barcelona-Spain-April-2013

Text text text text text ...

Madrid-Spain-April-2013

Text text text ...";

preg_match_all("/^(.*?)-(.*?)-(.*?)-(.*?)\/",$body, $match);

for($i=0;$i<sizeof($match[1]);$i++)
  {
    echo $match[1][$j].'<br/>';
  }

谢谢。

2 个答案:

答案 0 :(得分:2)

^表示“字符串的开头”。

添加m修饰符,使其成为“行首”。

然后更容易:

preg_match_all("/^(?:[^-\n]+-){3}[^-\n]+$/m",$body,$matches);

var_dump($matches[0]);

这应该输出一个包含匹配的每一行的数组。

答案 1 :(得分:1)

如果在最后一行中定义年份,则您不需要正则表达式来完成此任务,如下所示:

<?php
$yearsList = array(2013, 2014);
$body = " Text text text ...


Porto-Portugal-May-2013
Barcelona-Spain-April-2013

Text text text text text ...

Madrid-Spain-April-2013

Text text text ...";

$arr = explode("\n",$body);
$res = array();
foreach ($arr as $items){
  $itemArr = explode('-', $items);
    foreach ($itemArr as $item){
      if (in_array($item, $yearsList)) $res[] = $items;
    }
}
echo "<pre>";
print_r($res);
?>

查看此演示:http://codepad.org/fdhwEJC4