static PhpValue PregReplaceInternal(Context ctx, string pattern, string replacement, IPhpCallable callback, PhpValue subject, int limit, ref long count) { var regex = new PerlRegex.Regex(pattern); // callback PerlRegex.MatchEvaluator evaluator = null; if (callback != null) { evaluator = (match) => { var matches_arr = new PhpArray(0); GroupsToPhpArray(match.PcreGroups, false, matches_arr); return(callback .Invoke(ctx, (PhpValue)matches_arr) .ToStringOrThrow(ctx)); }; } // TODO: subject as a binary string would be corrupted after Replace - https://github.com/peachpiecompiler/peachpie/issues/178 // var subject_array = subject.AsArray(); if (subject_array == null) { return(PhpValue.Create( evaluator == null ? regex.Replace(subject.ToStringOrThrow(ctx), replacement, limit, ref count) : regex.Replace(subject.ToStringOrThrow(ctx), evaluator, limit, ref count))); } else { var arr = new PhpArray(subject_array.Count); var enumerator = subject_array.GetFastEnumerator(); while (enumerator.MoveNext()) { var newvalue = evaluator == null ? regex.Replace(enumerator.CurrentValue.ToStringOrThrow(ctx), replacement, limit, ref count) : regex.Replace(enumerator.CurrentValue.ToStringOrThrow(ctx), evaluator, limit, ref count); // TODO: trick on how to quickly update values od enumerated array without hashing: // enumerator.CurrentValue = PhpValue.Create(newvalue); arr[enumerator.CurrentKey] = newvalue; } return(PhpValue.Create(arr)); } }
static PhpValue PregReplaceInternal(Context ctx, string pattern, string replacement, IPhpCallable callback, PhpValue subject, int limit, ref long count) { var regex = new PerlRegex.Regex(pattern); // TODO: count // callback PerlRegex.MatchEvaluator evaluator = null; if (callback != null) { evaluator = (match) => { var matches_arr = new PhpArray(0); foreach (PerlRegex.Group g in match.Groups) { matches_arr.Add((PhpValue)g.Value); } return(callback .Invoke(ctx, (PhpValue)matches_arr) .ToStringOrThrow(ctx)); }; } // var subject_array = subject.AsArray(); if (subject_array == null) { return(PhpValue.Create( evaluator == null ? regex.Replace(subject.ToStringOrThrow(ctx), replacement, limit) : regex.Replace(subject.ToStringOrThrow(ctx), evaluator, limit))); } else { var arr = new PhpArray(subject_array, false); var enumerator = arr.GetFastEnumerator(); while (enumerator.MoveNext()) { var newvalue = evaluator == null ? regex.Replace(enumerator.CurrentValue.ToStringOrThrow(ctx), replacement, limit) : regex.Replace(enumerator.CurrentValue.ToStringOrThrow(ctx), evaluator, limit); enumerator.CurrentValue = PhpValue.Create(newvalue); } return(PhpValue.Create(arr)); } }