On Sat, May 4, 2013 at 8:58 PM, Nikita Popov <nikita....@gmail.com> wrote:
> On Sat, May 4, 2013 at 2:52 PM, Laruence <larue...@php.net> wrote: > >> >> >> >> On Sat, May 4, 2013 at 8:49 PM, Nikita Popov <nikita....@gmail.com>wrote: >> >>> On Sat, May 4, 2013 at 2:39 PM, Laruence <larue...@php.net> wrote: >>> >>>> Hey: >>>> Sorry for the delay, the new patch, which make the second argument >>>> the >>>> regex array keys is attached. >>>> >>>> >>>> >>>> https://bugs.php.net/patch-display.php?bug_id=64730&patch=second_arg_rege_key.patch&revision=latest >>>> >>>> with this patch, preg_replace_callback will call user callback with >>>> two >>>> arguments, the first one is the same, the second is the regex key if >>>> the >>>> regex is an array or NULL if the regex is a string. >>>> >>>> then we can do something like: >>>> >>>> $code = preg_replace_callback( >>>> array( >>>> "foo" => "/some very complex regex/", >>>> "bar" => "/another one/", >>>> ... >>>> ), >>>> function($matches, $idx) { >>>> switch ($idx) { >>>> case 'foo' >>>> ... >>>> case 'bar': >>>> ... >>>> } >>>> }, >>>> $code); >>>> >>>> >>>> if no objections, I will commit this patch after 5.5. 0 final >>>> release.. >>>> >>>> thanks >>>> >>> >>> I object. If this were using the preg_replace_callback(Array, Array, >>> String) syntax [which is not practically possible due to ambiguity], I >>> would agree that this is a nice feature which makes the function consistent >>> with preg_replace and str_replace. But this implementation with some weird >>> additional identifier that you need to switch over makes absolutely no >>> sense to me and only complicated the API. Better to just use a loop for >>> this. >>> >> if you got an better solution, please propose it. >> >> only object won't help much here, since the problem is there, we need to >> solve it. >> >> thanks >> > > Sorry, but what problem is there again? As I already said earlier, you can > just use a loop: > > > foreach ($replacements as $regex => $callback) { > $str = preg_replace_callback($regex, $callback, $str); > } > So if there are 10 regex in the array, you will got 10 DO_FCALL. 10 times arguments accept, 10 times etc... and AS I already said: IT is inefficient. I personally can not accept it. thanks > > Which is both clearer and requires less code. > > Nikita > -- Laruence Xinchen Hui http://www.laruence.com/