Bug #81537 [Com]: Error in regular expression using negation.
| From: | antonio at softcodex dot ch | Date: | Wed, 21 Sep 2022 08:24:32 +0000 |
| Subject: | Bug #81537 [Com]: Error in regular expression using negation. | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-242446@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=81537&edit=1
ID: 81537
Comment by: antonio at softcodex dot ch
Reported by: jansverre at uffe dot no
Summary: Error in regular expression using negation.
Status: Verified
Type: Bug
Package: PCRE related
Operating System: Ubuntu Linux 20.04
PHP Version: 8.0.11
Block user comment: N
Private report: N
New Comment:
Not sure if it's the same issue.
I have this regex (see below) that doesn't work on
PHP 7.3.33:
7.3.33-6+ubuntu20.04.1+deb.sury.org+1
but WILL work on the windows binary and "php:7.3-apache" docker image
PHP 8.1.10: only tested the windows binary
preg_match( '/<(\w+)[\s\w\-]+ id="S44_i89ew">/', '<br><div
id="S44_i89ew">' , $matches );
expected result:
array(2) {
[0]=> string(20) "<div id="S44_i89ew">" [1]=> string(3)
"di"
}
actial result:
array(0) { }
The strangely if you change the + quantifier after [\s\w\-] to * or ? it works.
Previous Comments:
------------------------------------------------------------------------
[2022-01-04 22:08:02] sebastiaodomingos05 at gmail dot com
As I can see, it is rather related to an extra space after adding the letter 'a'.
------------------------------------------------------------------------
[2021-12-01 15:11:36] cmb@php.net
This is apparently fixed in PCRE2 10.39 (or maybe earlier),
bundled as of PHP 8.1.1. I'm not sure whether we should update
PHP-8.0 to this PCRE2 version.
------------------------------------------------------------------------
[2021-10-18 08:43:04] cmb@php.net
This is a PCRE JIT issue (<https://3v4l.org/0Em35> vs.
<https://3v4l.org/I8BQ4>).
------------------------------------------------------------------------
[2021-10-18 08:32:32] jansverre at uffe dot no
Description:
------------
Regular expression that *should* match a text does not match it. In the code sample, the second
preg_match will match the link in the string, but not the first, and the only difference is that the
input string contains an extra 'a' letter.
Test script:
---------------
$regex = '/(^|[\n\s\>\\";]+)([^ \,"\t\n\r<>;]+\.[^
\,\"\t\n\r<]+)/iu';
$text = 'This is a normal text. http://vg.no, VG';
preg_match_all($regex, $text, $matches);
print_r($matches);
$text = 'This is normal text. http://vg.no, VG';
preg_match_all($regex, $text, $matches);
print_r($matches);
Expected result:
----------------
Both $matches should contain the link http://vg.no
Actual result:
--------------
Only the last $matches contains the link.
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=81537&edit=1