疑难解答 preg_match_all
Troubleshooting preg_match_all
我继承了一段突然无法运行的代码。它试图使用正则表达式来匹配 HTML 内容中的各种数据。我不确定是因为 HTML 内容中的间距最近发生了变化,还是存在更大的问题。我可以在单个数据上设置较小的匹配项,但我宁愿将其全部保留在一个 preg_match_all 调用中。
这是相关代码的示例,以及一个沙箱 link 以显示其执行情况。
http://sandbox.onlinephpfunctions.com/code/2ebb3707a5d8cd5871005b4e77076cd230a8abca
$html_content = '<tr>
<td class="">
<span class="new">1111</span>
</td>
<td data-order="title1"><a href="test.php?id=1111">title1</a></td>
<td data-order="20190917000000">09/2019</td>
<td data-order="1"></td>
<td>02/18/2020</td>
</tr>
<tr>
<td class="">
<span class="new">2222</span>
</td>
<td data-order="title2"><a href="test.php?id=2222">title2</a></td>
<td data-order="20190917000000">09/2019</td>
<td data-order="2"></td>
<td>01/13/2020</td>
</tr>
<tr>
<td class="">
<span class="new">3333</span>
</td>
<td data-order="title3"><a href="test.php?id=3333">title3</a></td>
<td data-order="20190917000000">09/2019</td>
<td data-order="5"></td>
<td>01/13/2020</td>
</tr>';
$content_array = array();
preg_match_all('%>(\d+)</span>\s+</td>\s+<td data-order=".+?"><a href="(.+?)">.+?</a></td>\s+<td data-order="(\d+)000000">\d+/\d+</td>\s+<td data-order="\d+">$\d+</td>\s+<td>(\d+/\d+/\d+)</td>\s+<td>(\d+/\d+/\d+)</td>%', $html_content, $content_array);
print_r($content_array);
正则表达式需要 2 个单元格,最后是日期:
<td>(\d+/\d+/\d+)</td>\s+<td>(\d+/\d+/\d+)</td>
而你只有一个:
<td>01/13/2020</td>
如果您从它匹配的正则表达式中删除额外的日期单元格:
>(\d+)</span>\s+</td>\s+<td data-order=".+?"><a href="(.+?)">.+?</a></td>\s+<td data-order="(\d+)000000">\d+/\d+</td>\s+<td data-order="\d+">$\d+</td>\s+<td>(\d+/\d+/\d+)</td>
我继承了一段突然无法运行的代码。它试图使用正则表达式来匹配 HTML 内容中的各种数据。我不确定是因为 HTML 内容中的间距最近发生了变化,还是存在更大的问题。我可以在单个数据上设置较小的匹配项,但我宁愿将其全部保留在一个 preg_match_all 调用中。
这是相关代码的示例,以及一个沙箱 link 以显示其执行情况。
http://sandbox.onlinephpfunctions.com/code/2ebb3707a5d8cd5871005b4e77076cd230a8abca
$html_content = '<tr>
<td class="">
<span class="new">1111</span>
</td>
<td data-order="title1"><a href="test.php?id=1111">title1</a></td>
<td data-order="20190917000000">09/2019</td>
<td data-order="1"></td>
<td>02/18/2020</td>
</tr>
<tr>
<td class="">
<span class="new">2222</span>
</td>
<td data-order="title2"><a href="test.php?id=2222">title2</a></td>
<td data-order="20190917000000">09/2019</td>
<td data-order="2"></td>
<td>01/13/2020</td>
</tr>
<tr>
<td class="">
<span class="new">3333</span>
</td>
<td data-order="title3"><a href="test.php?id=3333">title3</a></td>
<td data-order="20190917000000">09/2019</td>
<td data-order="5"></td>
<td>01/13/2020</td>
</tr>';
$content_array = array();
preg_match_all('%>(\d+)</span>\s+</td>\s+<td data-order=".+?"><a href="(.+?)">.+?</a></td>\s+<td data-order="(\d+)000000">\d+/\d+</td>\s+<td data-order="\d+">$\d+</td>\s+<td>(\d+/\d+/\d+)</td>\s+<td>(\d+/\d+/\d+)</td>%', $html_content, $content_array);
print_r($content_array);
正则表达式需要 2 个单元格,最后是日期:
<td>(\d+/\d+/\d+)</td>\s+<td>(\d+/\d+/\d+)</td>
而你只有一个:
<td>01/13/2020</td>
如果您从它匹配的正则表达式中删除额外的日期单元格:
>(\d+)</span>\s+</td>\s+<td data-order=".+?"><a href="(.+?)">.+?</a></td>\s+<td data-order="(\d+)000000">\d+/\d+</td>\s+<td data-order="\d+">$\d+</td>\s+<td>(\d+/\d+/\d+)</td>