preg_match_all php的奇怪行为

preg_match_all php的奇怪行为,php,regex,Php,Regex,我有一个很长的html字符串。从这个字符串中,我想解析城市的RU和eng名称对。此字符串的示例为: $html='1 Хакасия республика Красноярский край Тюменская область '; 我的代码是: $subject = $this->html; $pattern = '/<a href="([\/a-zA-Z0-9-"]*)">([а-яА-Я]*)/'; preg_match_all($pattern, $subject, $

我有一个很长的html字符串。从这个字符串中,我想解析城市的RU和eng名称对。此字符串的示例为:

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

我的代码是:

$subject = $this->html;
$pattern = '/<a href="([\/a-zA-Z0-9-"]*)">([а-яА-Я]*)/';
preg_match_all($pattern, $subject, $matches);
$subject=$this->html;
$pattern=/
在测试中使用全局修饰符-/g
因为在PHP中,我们不能使用/g修饰符,我使用preg\u match\u 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] => Аб�
        )

)
数组
(
[0]=>阵列
(
[0] => Абакан
[1] => Абан
[2] => Аба�
[3] => Аб�
)
[1] =>阵列
(
[0]=>/forecasts5000/俄罗斯/哈卡斯共和国/阿巴坎
[1] =>/forecasts5000/俄罗斯/克拉斯诺亚尔斯克地区/阿班
[2] =>/forecasts5000/俄罗斯/秋门地区/阿巴茨基
[3] =>/forecasts5000/俄罗斯/阿尔汉格尔斯克地区/阿布拉莫夫斯基马
)
[2] =>阵列
(
[0] => Абакан
[1] => Абан
[2] => Аба�
[3] => Аб�
)
)
首先-它只找到了第一个匹配项(但我需要获取包含所有匹配项的数组) 第二个结果对我来说很奇怪。我想得到下一个结果: 成对/艏楼5000/俄罗斯/哈卡斯共和国/阿巴坎和Аааааааааа
我做错了什么?

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

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

如果使用此选项,则可以通过以下方式获取所需信息:

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

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

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

如果使用此选项,则可以通过以下方式获取所需信息:

foreach ($matches as $match) {
    $url = $match[1];
    $text = $match[2];
    // Do something with $url and $text
}
您还可以使用对每种情况都有单独方法的:)

pattern('您也可以使用它,它对每种情况都有单独的方法:)


模式('请显示您实际的PHP代码。这正是我希望看到的,您希望看到什么?2 hjpotter92:添加了一个代码2 scragar:添加了关于我期望的信息。请显示您实际的PHP代码。这正是我希望看到的,您希望看到什么?2 hjpotter92:添加了一个代码2 scragar:添加了关于我期望的信息ried添加此标志,但它是仅排序我的结果而不是更改它。我尝试添加此标志,但它是仅排序我的结果而不是更改它。