preg_match_all php的奇怪行为

时间:2014-08-06 16:00:09

标签: php regex

我有一长串html。从这个字符串我想解析一对城市的rus和eng名称。此字符串的示例是:

$ html ='                             Абакан                                                          Хакасияреспублика                                                                               Абан                                                          Красноярскийкрай                                                                               Абатский                                                          Тюменскаяобласть                         “;

我的代码是:

$subject = $this->html;
$pattern = '/<a href="([\/a-zA-Z0-9-"]*)">([а-яА-Я]*)/';
preg_match_all($pattern, $subject, $matches);

尝试使用regexer。你可以在这里看到它http://regexr.com/399co 在测试中使用全局修饰符 - / g 因为在PHP中我们不能使用/ g修饰符我使用preg_match_all函数。但是preg_match_all的结果很奇怪:

Array
(
    [0] => Array
        (
            [0] => <a href="/forecasts5000/russia/republic-khakassia/abakan">Абакан
            [1] => <a href="/forecasts5000/russia/krasnoyarsk-territory/aban">Абан
            [2] => <a href="/forecasts5000/russia/tyumen-area/abatskij">Аба�
            [3] => <a href="/forecasts5000/russia/arkhangelsk-area/abramovskij-ma">Аб�
        )

    [1] => Array
        (
            [0] => /forecasts5000/russia/republic-khakassia/abakan
            [1] => /forecasts5000/russia/krasnoyarsk-territory/aban
            [2] => /forecasts5000/russia/tyumen-area/abatskij
            [3] => /forecasts5000/russia/arkhangelsk-area/abramovskij-ma
        )

    [2] => Array
        (
            [0] => Абакан
            [1] => Абан
            [2] => Аба�
            [3] => Аб�
        )

)

首先 - 它只找到第一场比赛(但我需要获得所有比赛的数组) 第二个结果对我来说很奇怪。我想得到下一个结果: 对/ forecast5000 /俄罗斯/共和国 - 卡哈西亚/阿巴坎和Абакан  我做错了什么?

2 个答案:

答案 0 :(得分:4)

结果的元素0是正则表达式的每个完整匹配的数组。元素1是捕获组1的所有匹配的数组,元素2包含捕获组2,依此类推。

您可以使用PREG_SET_ORDER标志将其反转。然后元素0将包含第一个匹配的所有结果,元素1将包含第二个匹配的所有结果,依此类推。在其中的每一个中,[0]将是完全匹配,其余元素将是捕获组。

如果您使用此选项,则可以获得所需的信息:

foreach ($matches as $match) {
    $url = $match[1];
    $text = $match[2];
    // Do something with $url and $text
}

答案 1 :(得分:0)

您还可以使用GitHub/me/XamZeroMq,每种情况都有单独的方法:)

$subject = $this->html;
pattern('<a href="([/a-zA-Z0-9-"]*)">([а-яА-Я]*)')
  ->match($this->html)
  ->all()
  ->forEach(function (Match $match) {
      $match = $match->text();
      $group = $match->group(1);
      echo "Match $match with group $group"
  });

我也有自动定界符