S dovolením jsem vynechal stranu 2 a stranu 3, takže jsem přišel o baladu o kalhotech a větrech ze severu. (Možná si to přečtu až budu potřebovat upustit páru)
Ale tohle má být nějaká vysokoškolská úloha, kdy máš vymyslet algoritmus, nebo jen potřebuješ poradit existující funkci z knihovny? (Klíčem implementace je nezamotat se v opakujících subvýrazech, jak v vyhledávacím kroku, tak v nahrazovacím kroku-v případě že by se nahrazovalo imperativně v cyklu. Radši bych slovo krok uplně vynechal)
MŮJ ROZBOR
Já bych přispěl druhým možným algoritmem - v první fázi provedu jen vyhledání. Vzniká problém, že může vzniknout víc řešení vyhledání výrazů. Nabízí se hledání podle nejdelšího, ale pak stále tu zůstane problém, co třeba s patterny "bene" a "nebe" pro slovo "benebe, be". Tohle pořadí musí si určit programátor sám. Jako bonus tam můžeme přihodit pattern "be"
Fáze nahrazovací musí proběhnout "transakčně". Třeba nejdřív určením ochranného znaku třeba #, potom nahrazením # třeba za #0. Pak nahrazením patternů za #1, #2.... (#N - N=přirozená čísla=bez nuly) Pak nahrazením #N za nahrazené varianty a nakonec vrácením #0 za #...
Ale třeba zadání může být i takové, aby se nahrazovalo donekonečna... V tom případě právě transakčnost je nežádoucí a může z toho vzniknout turingův stroj, pokud se nepletu. Radši to típnu
A jinak bych poradil funkci preg_replace_callback a její ekvivalenty. Možná by ani nebyla potřeba nahrazovací část řešena být callbackově.