Re: RegExp question: how to add a number?
| From: | Andrew Ballard | Date: | Fri, 15 Oct 2010 15:18:04 +0000 |
| Subject: | Re: RegExp question: how to add a number? | ||
| References: | 1 2 3 4 5 | Groups: | php.general |
| Request: | Send a blank email to php-general+get-308740@lists.php.net to get a copy of this message | ||
On Fri, Oct 15, 2010 at 11:07 AM, Richard Quadling <rquadling@gmail.com> wrote:
> On 15 October 2010 15:45, Andrew Ballard <aballard@gmail.com> wrote:
>> On Fri, Oct 15, 2010 at 5:52 AM, Richard Quadling <rquadling@gmail.com> wrote:
>>> On 15 October 2010 10:16, Ford, Mike <M.Ford@leedsmet.ac.uk> wrote:
>>>>> -----Original Message-----
>>>>> From: Andre Polykanine [mailto:andre@oire.org]
>>>>> Sent: 14 October 2010 21:42
>>>>>
>>>>> Hi everyone,
>>>>> I hope you're doing well (haven't written here for a long time :-)).
>>>>> The question is as follows: I have a regexp that would do the
>>>>> following. If the string begins with "Re:", it will change the
>>>>> beginning to "Re[2]:"; if it doesn't, then it would add
>>>>> "Re:" at the
>>>>> beginning. But (attention, here it is!) if the string starts with
>>>>> something like "Re[4]:", it should replace it by "Re[5]:".
>>>>> Here's the code:
>>>>>
>>>>> $start=mb_strtolower(mb_substr($f['Subject'], 0, 3));
>>>>> if ($start=="re:") {
>>>>> $subject=preg_replace("/^re:(.+?)$/usi", "re[2]:$1",
>>>>> $f['Subject']);
>>>>> } elseif ($start=="re[") {
>>>>> // Here $1+1 doesn't work, it returns "Re[4+1]:"!
>>>>> $subject=preg_replace("/^re\[(\d+)\]:(.+?)$/usi",
>>>>> "re[$1+1]:$2",
>>>>> $f['Subject']);
>>>>> } else {
>>>>> $subject="Re: ".$f['Subject'];
>>>>> }
>>>>>
>>>>> I know there actually exists a way to do the numeral addition
>>>>> ("Re[5]:", not "Re[4+1]:").
>>>>> How do I manage to do this?
>>>>
>>>> This looks like a job for the "e" modifier (see
>>>> http://php.net/manual/en/reference.pcre.pattern.modifiers.php, and
>>>> example #4 at http://php.net/preg_replace). Something like:
>>>>
>>>> $subject = preg_replace("/^re\[(\d+)\:](.+?)$/eusi",
>>>> "'re['.(\\1+1).']:\\2'", $f['Subject']);
>>>>
>>>> Cheers!
>>>>
>>>> Mike
>>>
>>> Watch out for the missing '[1]'. This needs to become '[2]' and not
>>> '[1]'.
>>>
>>> The callback seems to be the only way I could get the regex to work.
>>>
>>
>> How about preg_replace_callback()?
>>
>> Andrew
>>
>
> Already provided an example using that :
> http://news.php.net/php.general/308728
>
> It was the 'e' modifier I couldn't get to work, though I suppose, as
> the code is eval'd, I should have been able to do it.
>
> The callback just seems a LOT easier.
>
Sorry - I missed the callback function in there. The loop threw me off
because I thought that was part of the solution rather than a test
container.
Andrew