Bug #74132 [ReO->Csd]: preg_match_all hitting backtrack limit in master and not in released versions
| From: | cmb@php.net | Date: | Wed, 21 Mar 2018 13:43:41 +0000 |
| Subject: | Bug #74132 [ReO->Csd]: preg_match_all hitting backtrack limit in master and not in released versions | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-214432@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=74132&edit=1
ID: 74132
Updated by: cmb@php.net
Reported by: liyan at bianhua8 dot com
Summary: preg_match_all hitting backtrack limit in master and
not in released versions
-Status: Re-Opened
+Status: Closed
Type: Bug
Package: PCRE related
Operating System: ubuntu
PHP Version: 7.1Git-2017-02-20 (Git)
-Assigned To:
+Assigned To: cmb
Block user comment: N
Private report: N
New Comment:
<https://3v4l.org/ApKvQ> works fine, so I assume this has
been a
temporary issue.
Previous Comments:
------------------------------------------------------------------------
[2017-02-21 06:19:10] requinix@php.net
I'm not convinced this isn't a bug. Certainly it might not be, but something changed and
I'm not sure it wasn't upstream in libpcre or that it was intentional.
------------------------------------------------------------------------
[2017-02-21 06:05:12] liyan at bianhua8 dot com
i see, thanks requinix and andrew a lot :)
------------------------------------------------------------------------
[2017-02-20 13:35:21] andrew dot nester dot dev at gmail dot com
as I can see from this code you are really receiving error. It's PHP_PCRE_BACKTRACK_LIMIT_ERROR
you can set higher backtrack limit like this and you'll be fine (tested on my end)
ini_set("pcre.backtrack_limit", "10000000")
------------------------------------------------------------------------
[2017-02-20 13:31:17] requinix@php.net
It looks like libpcre in master is hitting the backtrack limit. preg_match_all() returning false
means there was an error during matching, but it can still "return" any matches that were
found. JIT on or off doesn't seem to make a difference here.
I don't know why master cannot complete the matching - libpcre hasn't been upgraded since
a year ago...
Solution:
Besides increasing the backtrack limit, you can make a simple change to your regex. The problem is
that PCRE will try a second match starting at
<div class="link0 list-side-hd moderator-noborder obj2subject">
^
and reach the backtrack limit before it fails to match.
If I modify the regex as
/"subject"[\s\S]+?...
then it matches correctly and returns successfully for me.
Side comment: don't use regular expressions to parse HTML. Use DOM.
------------------------------------------------------------------------
[2017-02-20 12:02:43] liyan at bianhua8 dot com
follow is the test script, same as my first post.
<?php
$content = '<th class="title">
<div class="subject">
<a href="158391487256182472-1-1.html"
title="Jomashopï¼Swarovski"></a>
</div>
</th>
<td class="author">
<a href="profile-42357964-1.html"
title="author"><span>cat</span></a>
<span>2017-02-16</span>
</td>
<div class="link0 list-side-hd moderator-noborder obj2subject"><h3
class="fl"></h3></div><ul class="list-side-bd list-recommend
list-recommend2 link1"><li><a target="_blank"
href="//go.cqmmgo.com/forum-462505-thread-94061456905358538-1-1.html"><img
width="120" height="160" title="#" alt="#"
src="//att3.citysbs.com/120x120/chongqing/2016/03/09/09/160x120-092826_v2_11861457486906377_58b326482e2aa1f1da0f8455ac42187f.jpg"></a></li><li><a
target="_blank"
href="//go.cqmmgo.com/forum-462505-thread-179021457000027333-1-1.html"><img
width="120" height="160" title="#" alt="#"
src="//att3.citysbs.com/120x120/chongqing/2016/03/09/09/160x120-092826_v2_20771457486906773_31eb80d49e9ef06418003e577cc1453f.jpg"></a></li><li><a
target="_blank"
href="//go.cqmmgo.com/forum-462505-thread-93091456983256969-1-1.html"><img
width="120" height="160" title="#" alt="#"
src="//att3.citysbs.com/120x120/chongqing/2016/03/09/09/160x120-092827_v2_20231457486907098_05bc3d4608c961af0660722e03049e20.jpg"><span>!
abc</span></a></li><li><a target="_blank"
href="//go.cqmmgo.com/forum-462505-thread-13801456844284137-1-1.html"><img
width="120" height="160" title="#" alt="#"
src="//att3.citysbs.com/120x120/chongqing/2016/03/09/09/160x120-092827_v2_14121457486907436_d49c002ba8675553c5436e80f305aca7.jpg"><span>xxxxxxxxxxxxxxxxxxxxxxxxxxxxx</span></a></li></ul></div>';
$ret =
preg_match_all('/subject[\s\S]+?href="(.+?)"[\s\S]+?title="([\s\S]+?)"[\s\S]+?profile/',
$content, $matches);
var_dump($matches); // have array result
var_dump($ret); // bug the return value is false
?>
------------------------------------------------------------------------
The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
https://bugs.php.net/bug.php?id=74132
--
Edit this bug report at https://bugs.php.net/bug.php?id=74132&edit=1