Autor Zpráva
peCan
Profil
Ahoj,

Prosím o pomoc s RV.

Mám XML se vzory, které jsou psané pro C# a využívají pojmenované subvýrazy.
V jednom vzoru bohužel může být více skupin (pojmenovaných <R>).

Potřebuji tyto vzory aplikovat na libovolný text, v případě shody místo <R> dát
"*****". Zpracování probíhá v PHP.


// načtení XML vzorů, tady jsem to dal do pole
$ReplacementsArray = array(
'database "(?<R>[^"]*)"',
"database '(?<R>[^']*)'",
"user '(?<R>[^']*)'",
"The process cannot access the file '(?<R>[^']*)'",
"Syntax error converting the nvarchar value '(?<R>[^']*)'",
"The operating system returned the error '[^']*' while
attempting '[^']*' on '(?<R>[^']*)'",
"Transaction \(Process ID (?<R>\d+)\) was deadlocked"
);

// foreach
$ExceptionTextHeader = preg_replace("/".str_replace("<R>", "P<R>", $pattern)."/", '"*****"', $ExceptionTextHeader);


Bohužel tento RV mě místo:
Bla bla bla. Transaction (Process ID *****) was deadlocked. Bla bla bla


Udělá
Bla bla bla. *****. Bla bla bla



Tedy se nahradí celý text co je v RV, nikoliv jen označená skupina.
Samozřejmě bych mohl udělat nahrazení místo ***** celý text, ale jde o to, že v tom XML je několik desítek až stovek RV...
tiso
Profil
peCan: nechápem čo chceš vlastne spraviť… Desiatky až stovky regulárnych výrazov?
peCan
Profil
Ahoj,

V zásadě jde o to, že v textu potřebuji najít a nahradit určitou část textu za *****.
Tak jako jsem uvedl v příkladu:

Mám např. RV: "Transaction \(Process ID (?<R>\d+)\) was deadlocked". Místo té skupiny <R> potřebuji dostat *****.

Vstupní text je: Bla bla bla.... Transaction (Process ID 52) was deadlocked. Bla Bla Bla...

A já potřebuji dostat: Bla bla bla.... Transaction (Process ID *****) was deadlocked. Bla Bla Bla...

preg_replace("/".str_replace("<R>", "P<R>", $pattern)."/", '"*****"', $ExceptionTextHeader);
vrací Bla bla bla. *****. Bla bla bla. Tedy se nahradí celý text, nikoliv jen označená skupina.

Ano, mohl bych udělat něco jako:
preg_replace("/Transaction \(Process ID (?P<R>\d+)\) was deadlocked/", 'Transaction (Process ID *****) was deadlocked', $ExceptionTextHeader);

Ale to nechci, protože bych musel upgravovat hrozně obsáhlé XML, kde jsou těch vzorů stovky.
tiso
Profil
peCan: mohli by ti pomôcť tvrzení o následujícím/předcházejícím, viď Speciální závorkové konstrukce, ak nie, tak si ten reťazec uzátvorkuj po jednotlivých častiach (Transaction…)(<R>…)(was…) a nahrádzaj ich za '\\1 ***** \\3'

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0