RE: [PHP] regex question

From: Date: Mon, 16 May 2005 22:56:51 +0000
Subject: RE: [PHP] regex question
References: 1  Groups: php.general 
Request: Send a blank email to php-general+get-215340@lists.php.net to get a copy of this message
> Try (for example if character was "A") ... > > ([^A]|^)A([^A]|$) > > This matches four cases: > A is at beginning of string and there is another letter after it, > A has a letter before it and a letter after it, > A is at end of string and there is a letter before it, > or A is the only character in the string. I think this has the same problem that my first attempt at this regex experienced. I.e., it will correctly 'find' single instances of 'A', but it will 'match' against unwanted characters on either side of each 'found' 'A' because they are not-A. For example, the following: preg_match_all('/([^A]|^)A([^A]|$)/','A sentence with instAnces of AAA chArActers', $thing, PREG_OFFSET_CAPTURE); print_r($thing); produces: Array ( [0] => Array ( [0] => Array ( [0] => A [1] => 0 ) [1] => Array ( [0] => tAn [1] => 19 ) [2] => Array ( [0] => hAr [1] => 34 ) ) [1] => Array ( [0] => Array ( [0] => [1] => 0 ) [1] => Array ( [0] => t [1] => 19 ) [2] => Array ( [0] => h [1] => 34 ) ) [2] => Array ( [0] => Array ( [0] => [1] => 1 ) [1] => Array ( [0] => n [1] => 21 ) [2] => Array ( [0] => r [1] => 36 ) ) ) Note the multiple instances of characters other than 'A' in the array. Also note that the 4th qualifying 'A' (the second 'A' in 'chArActers') is missed, because the 'r' is already part of the capture of the preceding 'A'). On the other hand, the following: preg_match_all(' /(?<!A)A(?!A)/','A sentence with instAnces of AAA chArActers', $thing, PREG_OFFSET_CAPTURE); print_r($thing); produces: Array ( [0] => Array ( [0] => Array ( [0] => A [1] => 0 ) [1] => Array ( [0] => A [1] => 20 ) [2] => Array ( [0] => A [1] => 35 ) [3] => Array ( [0] => A [1] => 37 ) ) ) Here, only the target characters are matched, without the confusion of extra unwanted characters. All 4 target 'A's are caught, because the patterns on either side of the 'A' in the regex pattern are non-capturing. So, basically this is employing a non-capturing negative look-behind and a non-capturing negative look-ahead, rather than capturing negated character classes. I've probably only managed to confuse things more than they were, but I'm hoping some of what I've said above makes sense (to me, if no-one else). Regards, Murray

« previous php.general (#215340) next »