Zadejte hledaný výraz...

Pomoc s reg_replace

kreativka
verified
rating uzivatele
14. 1. 2020 10:11:51
Dokázal by mi někdo pomoct s regulerním výrazem?
Potřeboval bych v textu nahradit následovně:
- za čárkou není mezera = přidat mezeru (pokud nenásleduje číslo)
- za tečkou není mezera = přidat mezeru (pokud nenásleduje číslo)
- více než 3 tečky za sebou = nahradit 1 mezerou
- před "(" není mezera = přidat mezeru
- za ")" není mezera = přidat mezeru
- před uzavírající závorkou je tečka ".)" = smazat tečku
- za "(" je mezera = smazat mezeru
- před ")" je mezera = smazat mezeru
- před tečkou je mezera = smazat mezeru
- před čárkou je mezera = smazat mezeru
Děkuji za pomoc.
14. 1. 2020 10:11:51
https://webtrh.cz/diskuse/pomoc-s-reg_replace#reply1432864
TomasX
verified
rating uzivatele
(4 hodnocení)
14. 1. 2020 12:21:36
tohle je asi lepší si zadat do poptávek, ono to může zabrat dost času vychytat všechna pravidla a pokud nejsi schopný tohle zapsat sám, nejspíš ti bude dělat problém to upravit.
Něco jsem se ti pokusil podle tvých pravidel na ukázku zapsat. Je důležité pořadí pravidel, např. nejdříve musíš řešit tři tečky a pak přidávání mezery za tečku, takže jsem ty pravidla přeházel, v komentáři máš vždy napsané, co který výraz řeší za pravidla. Něco co dávalo smysl, jsem sdružil, šlo by toho sdružit více, ale za trest by byla horší čitelnost. Regulární výrazy nejsou na tohle nejefektivnější, u dlouhých textů to může trvat značnou dobu, to si musíš změřit a případně optimalizovat sám. Jako ukázkový text jsem vzal ty tvoje pravidla a trochu je upravil, aby tam byly nějaké vady, které opravuješ.
$text = 'Za čárkou není mezera,přidat mezeru.Za tečkou není mezera = přidat mezeru. více než 3 tečky za sebou...nahradit 1 mezerou . Před "(" není mezera = přidat mezeru , Za ")" není mezera = přidat mezeru. Před uzavírající závorkou je tečka ".)" = smazat tečku';
$rules = array();
# - více než 3 tečky za sebou = nahradit 1 mezerou
$rules[] = {3,})/m', ' '];
# - před uzavírající závorkou je tečka ".)" = smazat tečku
$rules[] = )()/m', '$2'];
# - za čárkou není mezera = přidat mezeru (pokud nenásleduje číslo)
# - za tečkou není mezera = přidat mezeru (pokud nenásleduje číslo)
$rules[] = )(?!)/m', '$1 '];
# - před "(" není mezera = přidat mezeru
$rules[] = )(?!)/m', ' $1'];
# - za ")" není mezera = přidat mezeru
$rules[] = )(?!)/m', '$1 '];
# - za "(" je mezera = smazat mezeru
$rules[] = )(+)/m', '$1'];
# - před ")" je mezera = smazat mezeru
# - před tečkou je mezera = smazat mezeru
# - před čárkou je mezera = smazat mezeru
$rules[] = +)()/m', '$2'];
$patterns = array_map(function($a) { return $a; }, $rules);
$replaces = array_map(function($a) { return $a; }, $rules);
var_dump(preg_replace($patterns, $replaces, $text));
14. 1. 2020 12:21:36
https://webtrh.cz/diskuse/pomoc-s-reg_replace#reply1432863
Pro odpověď se přihlašte.
Přihlásit