当前位置: 首页 > 知识库问答 >
问题:

preg_match_all只返回第一场比赛

斜单鹗
2023-03-14

好的,基本上,我试图遍历大量包含文件超链接的html代码。我在用preg_match_all找到所有发生的事情。然而,它永远不会返回预期的匹配量。

快照HTML代码(值为$content):

<a class="file_download file_ext_docx" href="/download.php?f=/LiO2beoordeling%20door%20mentor%20Maartje%20ingevuld.docx">Download file 1.docx</a><br /><em>Some text<a class="file_download file_ext_docx" href="/download.php?f=/BP3/Referenties.docx">Download file 2.docx</a> </strong><br /><strong>- Some text: <a class="file_download file_ext_docx" href="/download.php?f=/Zelfevaluatie%204.2.docx">Download file 3.docx</a> Soem text: <a class="file_download file_ext_docx" href="/download.php?f=/BP3/sz-lio.docx">Download file 4</a> </strong><br /><a class="file_download file_ext_docx" href="/download.php?f=/BP3/poplio.docx">

PHP代码:

preg_match_all('/download\.php\?f=(.*?)">/', $content, $matches);
foreach($matches as $val){
    echo $val[0] ."<br />";
}

上面的代码只为我返回第一个匹配项。奇怪的是,回荡着:

echo $val[1] ."<br />"; //Returns 2nd match
echo $val[2] ."<br />"; //Returns 3rd match
//etc

所以我想我应该数一数数组,然后把它绕成一个for循环来解决这个问题。然而:

count($matches); //Returns 1

共有2个答案

谷梁楷
2023-03-14

你的模式是对的,但你找错了地方
当我转储你的结果时,我发现它没问题:

array(2) {
  [0]=>
  array(5) {
    [0]=>
    string(75) "download.php?f=/LiO2beoordeling%20door%20mentor%20Maartje%20ingevuld.docx">"
    [1]=>
    string(38) "download.php?f=/BP3/Referenties.docx">"
    [2]=>
    string(42) "download.php?f=/Zelfevaluatie%204.2.docx">"
    [3]=>
    string(33) "download.php?f=/BP3/sz-lio.docx">"
    [4]=>
    string(33) "download.php?f=/BP3/poplio.docx">"
  }
  [1]=>
  array(5) {
    [0]=>
    string(58) "/LiO2beoordeling%20door%20mentor%20Maartje%20ingevuld.docx"
    [1]=>
    string(21) "/BP3/Referenties.docx"
    [2]=>
    string(25) "/Zelfevaluatie%204.2.docx"
    [3]=>
    string(16) "/BP3/sz-lio.docx"
    [4]=>
    string(16) "/BP3/poplio.docx"
  }
}
蒲坚
2023-03-14

首先,你应该仔细阅读php。net文档http://php.net/manual/en/function.preg-match-all.php

但是在resume中,preg_match_all根据您使用的标志放入$matches结果:preg_PATTERN_默认顺序,因此$matches数组应该是

命令的结果是,$匹配[0]是一个完整模式匹配的数组,$匹配[1]是一个由第一个括号内的子模式匹配的字符串数组,依此类推。

就你而言:

Array
(
    [0] => Array
        (
            [0] => download.php?f=/LiO2beoordeling%20door%20mentor%20Maartje%20ingevuld.docx">
            [1] => download.php?f=/BP3/Referenties.docx">
            [2] => download.php?f=/Zelfevaluatie%204.2.docx">
            [3] => download.php?f=/BP3/sz-lio.docx">
            [4] => download.php?f=/BP3/poplio.docx">
        )

    [1] => Array
        (
            [0] => /LiO2beoordeling%20door%20mentor%20Maartje%20ingevuld.docx
            [1] => /BP3/Referenties.docx
            [2] => /Zelfevaluatie%204.2.docx
            [3] => /BP3/sz-lio.docx
            [4] => /BP3/poplio.docx
        )

)

所以如果你想列出所有的结果,你可以

foreach($matches[0] as $val){
    echo $val ."<br />";
}
 类似资料:
  • 问题内容: 我有一个包含一堆字符串的文件,例如“ size = XXX;”。我第一次尝试使用python的re模块,并且对以下行为感到有些困惑:如果我在正则表达式中使用管道作为“或”,我只会看到返回的匹配项。例如: 匹配的“大小=”部分不见了。(但是,肯定会在搜索中使用它,否则将会有更多结果)。我究竟做错了什么? 问题答案: 您遇到的问题是,如果尝试匹配的正则表达式捕获组(即,括号中包含的正则表达

  • 我创建了这个函数来计算我要测量的距离: 由于我不明白的原因,距离的值只返回一次。因此,如果我在forEach函数中抛出2个位置,并且在循环中使用console.log,我会看到所有的计算都是正确的。但如果我返回距离的值,则只返回一个值。 如何正确返回值? 我使用VueJS,其中'Distance toResponder'是一个计算属性来填充表: 因此函数应该返回每个响应者的距离。那么我需要如何调整

  • 是否可以编写一个正则表达式,其中匹配1的最后一个符号是匹配2的开始符号?我喜欢匹配括号中的所有数字,并用管道隔开。情况也很复杂,因为比赛只能有一组深度。 这是我的字符串: 我想得到: 1234年 但是正则表达式应该不匹配: 我只找到了这个正则表达式{1}(\d)和这个问题,他还匹配了这样的文本(123 Text)。 我有一个关于regex101的例子:https://regex101.com/r/

  • 我试图使用API获取subreddit中的所有链接,但它只返回一个url。这是我的代码: 当我在浏览器中访问 json 链接时,它会返回所有 100 个帖子。

  • 问题内容: 我正在尝试使所有子字符串与乘数匹配: 此示例按预期返回最后一个匹配项: 但是,我希望所有的字符串都由匹配,以得到如下内容: 有没有办法通过单个功能来做到这一点? 问题答案: 根据Kobi: PHP不支持捕获同一组 因此,这个问题没有解决方案。