Bug #74132 [ReO->Csd]: preg_match_all hitting backtrack limit in master and not in released versions

From: 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

« previous php.bugs (#214432) next »