static PatternAndReplacement[] PreparePatternArray(Context ctx, PhpValue pattern, IPhpCallable callback) { if (callback == null) { PhpException.ArgumentNull(nameof(callback)); return(null); } var evaluator = new MatchEvaluator(match => { var matches_arr = new PhpArray(); GroupsToPhpArray(match.PcreGroups, false, false, matches_arr); return(callback .Invoke(ctx, (PhpValue)matches_arr) .ToStringOrThrow(ctx)); }); if (pattern.IsPhpArray(out var pattern_array)) { var regexes = new PatternAndReplacement[pattern_array.Count]; // array pattern int i = 0; var pattern_enumerator = pattern_array.GetFastEnumerator(); while (pattern_enumerator.MoveNext()) { if (TryParseRegexp(pattern_enumerator.CurrentValue.ToStringOrThrow(ctx), out var regex)) { regexes[i++] = new PatternAndReplacement(regex, evaluator); } else { return(null); } } return(regexes); } else { // string pattern if (TryParseRegexp(pattern.ToStringOrThrow(ctx), out var regex)) { return(new PatternAndReplacement[] { new PatternAndReplacement(regex, evaluator) }); } else { return(null); } } }
static PatternAndReplacement[] PreparePatternArray(Context ctx, PhpArray patterns_and_callbacks) { if (patterns_and_callbacks == null) { PhpException.ArgumentNull(nameof(patterns_and_callbacks)); return(null); } var regexes = new PatternAndReplacement[patterns_and_callbacks.Count]; int i = 0; var enumerator = patterns_and_callbacks.GetFastEnumerator(); while (enumerator.MoveNext()) { var pattern = enumerator.CurrentKey.String; var callback = enumerator.CurrentValue.AsCallable(); if (TryParseRegexp(pattern, out var regex)) { var evaluator = new MatchEvaluator(match => { var matches_arr = new PhpArray(); GroupsToPhpArray(match.PcreGroups, false, false, matches_arr); return(callback .Invoke(ctx, (PhpValue)matches_arr) .ToStringOrThrow(ctx)); }); regexes[i++] = new PatternAndReplacement(regex, evaluator); } else { return(null); } } // return(regexes); }
static PatternAndReplacement[] PreparePatternArray(Context ctx, PhpValue pattern, PhpValue replacement) { if (pattern.IsPhpArray(out var pattern_array)) { var regexes = new PatternAndReplacement[pattern_array.Count]; if (replacement.IsPhpArray(out var replacement_array)) { int i = 0; var pattern_enumerator = pattern_array.GetFastEnumerator(); var replacement_enumerator = replacement_array.GetFastEnumerator(); bool replacement_valid = true; while (pattern_enumerator.MoveNext()) { string replacement_string; // replacements are in array, move to next item and take it if possible, in other case take empty string: if (replacement_valid && replacement_enumerator.MoveNext()) { replacement_string = replacement_enumerator.CurrentValue.ToStringOrThrow(ctx); } else { replacement_string = string.Empty; replacement_valid = false; // end of replacement_enumerator, do not call MoveNext again } // if (TryParseRegexp(pattern_enumerator.CurrentValue.ToStringOrThrow(ctx), out var regex)) { regexes[i++] = new PatternAndReplacement(regex, replacement_string); } else { return(null); } } } else { // array pattern // string replacement var replacement_string = replacement.ToStringOrThrow(ctx); int i = 0; var pattern_enumerator = pattern_array.GetFastEnumerator(); while (pattern_enumerator.MoveNext()) { if (TryParseRegexp(pattern_enumerator.CurrentValue.ToStringOrThrow(ctx), out var regex)) { regexes[i++] = new PatternAndReplacement(regex, replacement_string); } else { return(null); } } } return(regexes); } else { if (replacement.IsPhpArray(out _)) { // string pattern and array replacement not allowed: // Parameter mismatch, pattern is a string while replacement is an array PhpException.InvalidArgument(nameof(replacement), LibResources.replacement_array_pattern_not); return(null); } // string pattern // string replacement if (TryParseRegexp(pattern.ToStringOrThrow(ctx), out var regex)) { return(new PatternAndReplacement[] { new PatternAndReplacement(regex, replacement.ToStringOrThrow(ctx)) }); } else { return(null); } } }