【问题标题】:Strange behavior of preg_match_all phppreg_match_all php的奇怪行为
【发布时间】:2014-08-06 16:00:09
【问题描述】:

我有一个很长的 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] => Аб�
        )

)

首先 - 它只找到第一个匹配项(但我需要获取所有匹配项的数组) 第二个结果对我来说很奇怪。我想得到下一个结果: 成对的 /forecasts5000/russia/republic-khakassia/abakan 和 Абакан 我做错了什么?

【问题讨论】:

  • 请出示您的实际 PHP代码。
  • 这正是我希望看到的,你期待什么?
  • 2 hjpotter92:添加了代码
  • 2 scragar:添加了关于我期望的信息

标签: php regex


【解决方案1】:

结果的元素 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
}

【讨论】:

  • 我尝试添加这个标志,但它只是对我的结果进行排序而不是更改它。
【解决方案2】:

您也可以使用T-Regx library,它对每种情况都有单独的方法:)

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

我也有自动分隔符

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-08
    • 2013-08-09
    • 2021-11-21
    • 2018-05-20
    • 2012-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多