通用正则表达式

时间:2013-11-16 19:20:16

标签: php regex string preg-match

好的,让我们重新开始,现在有更多细节。

我取了my_meta ['lieux']。此时,看起来似乎

string(176) "Paris:10/06/2013->link:20/09/2013->link
Londres:04/06/2014->link:23/09/2014->link
Toulouse:05/12/2015->link:05/12/2015->link"

在第一步之后,我进行拆分以存储每行不同的键/值

$str = $my_meta['lieux'];
$arr = split("\n", $str);

它返回此数组

array(3) {
  [0]=>string(82) "Paris:10/06/2013->link:20/09/2013->link"
  [1]=>string(46) "Londres:04/06/2014->link:23/09/2014->link"
  [2]=>string(46) "Toulouse:05/12/2015->link:05/12/2015->link"
}

现在我希望它存储在不同的键/值国家和每个国家/地区的日期/链接。

目前我做了类似的事情

for ($i = 0; $i < count($arr); $i++) {
  preg_match("/^(\w+)\:(\d\d\/\d\d\/\d\d\d\d)->(\w+)\:(\d\d\/\d\d\/\d\d\d\d)->(\w+)/", $arr[$i], $lieux_[$i]);
}

当我打印lieux _ [$ i]时我有

array(6) {
  [0]=>string(43) "Paris:10/06/2013->link:20/09/2013->link"
  [1]=>string(5) "Paris"
  [2]=>string(10) "10/06/2013"
  [3]=>string(6) "link"
  [4]=>string(10) "20/09/2013"
  [5]=>string(6) "link"
}
array(6) {
  [0]=>string(45) "Londres:04/06/2014->link:23/09/2014->link"
  [1]=>string(7) "Londres"
  [2]=>string(10) "04/06/2014"
  [3]=>string(6) "link"
  [4]=>string(10) "23/09/2014"
  [5]=>string(6) "link"
}
array(6) {
  [0]=>string(46) "Toulouse:05/12/2015->link:05/12/2015->link"
  [1]=>string(8) "Toulouse"
  [2]=>string(10) "05/12/2015"
  [3]=>string(6) "link"
  [4]=>string(10) "05/12/2015"
  [5]=>string(6) "link"
}

所以它非常好,我可以在此之后创建一个循环来将我的数据插入好的div等...

但问题是,如果我添加更多日期/链接(:04/06/2014->link),它就不再起作用,因为正则表达式错误(如果我有两个日期/链接,每个国家/地区)它正在工作,否则,它不再起作用了。)

我想得到类似的东西:

array(10) {
  [0]=>string(43) "Paris:10/06/2013->link:20/09/2013->link:20/09/2013->link:20/09/2013->link"
  [1]=>string(5) "Paris"
  [2]=>string(10) "10/06/2013"
  [3]=>string(6) "link"
  [4]=>string(10) "20/09/2013"
  [5]=>string(6) "link"
  [6]=>string(10) "20/09/2013"
  [7]=>string(6) "link"
  [8]=>string(10) "20/09/2013"
  [9]=>string(6) "link"
}
array(4) {
  [0]=>string(45) "Londres:04/06/2014->link"
  [1]=>string(7) "Londres"
  [2]=>string(10) "04/06/2014"
  [3]=>string(6) "link"
}
array(2) {
  [0]=>string(46) "Toulouse"
  [1]=>string(8) "Toulouse"
}
array(10) {
  [0]=>string(43) "country4:10/06/2013->link:20/09/2013->link:20/09/2013->link:20/09/2013->link"
  [1]=>string(5) "country4"
  [2]=>string(10) "10/06/2013"
  [3]=>string(6) "link"
  [4]=>string(10) "20/09/2013"
  [5]=>string(6) "link"
  [6]=>string(10) "20/09/2013"
  [7]=>string(6) "link"
  [8]=>string(10) "20/09/2013"
  [9]=>string(6) "link"
}

提前致谢。

2 个答案:

答案 0 :(得分:2)

这是因为你的正则表达式明确地只有两个日期和两个链接。

对于1 +日期和链接,请使用以下内容。

/^(\w+)(\:(\d\d\/\d\d\/\d\d\d\d)->(\w+))+/

Regular expression visualization

Debuggex Demo

答案 1 :(得分:-1)

您可以使用此模式:

preg_match_all(
    '~(?:^(?<country>\w+)|\G):(?<date>(?:[0-9]{2}/){2}[0-9]{4})->(?<link>\w+)~',
    $text, $matches, PREG_SET_ORDER);

foreach($matches as $match) {
    echo '<br/>' . $match['date'] . "\t" . $match['link'];
}

编辑:假设您的文本现在是一个行数组($lines),您可以这样做:

$lines = split("\n", $str);
$results = array();
foreach($lines as $line) {
    preg_match_all(
        '~(?:^(?<country>\w+)|\G):(?<date>(?:[0-9]{2}/){2}[0-9]{4})->(?<link>\w+)~',
        $line, $matches, PREG_SET_ORDER);

    foreach($matches as $match) {
        if ($match['country']) $country = $match['country'];
        $results[$country][] = array(
                           'date' => $match['date'],
                           'link' => $match['link']);
    }
}
print_r($results);