logo
14.01.2020 10:11
1
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.

Co se právě děje na Webtrhu?

14.01.2020 12:21
2
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š.

PHP kód:
<?php

$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[] = ['/([.,])(?![\s0-9])/m''$1 '];

# - před "(" není mezera = přidat mezeru
$rules[] = ['/([(])(?![\s])/m'' $1'];

# - za ")" není mezera = přidat mezeru
$rules[] = ['/([)])(?![\s])/m''$1 '];

# - za "(" je mezera = smazat mezeru
$rules[] = ['/([(])([\s]+)/m''$1'];

# - před ")" je mezera = smazat mezeru
# - před tečkou je mezera = smazat mezeru
# - před čárkou je mezera = smazat mezeru
$rules[] = ['/([\s]+)([).,])/m''$2'];


$patterns array_map(function($a) { return $a[0]; }, $rules);
$replaces array_map(function($a) { return $a[1]; }, $rules);
var_dump(preg_replace($patterns$replaces$text));