Autor Zpráva
nevimjakdal
Profil *
Dobrý den, chtěl bych se zeptat, mám řetězec

"auto je po silnici33"

a já bych potřeboval z daného stringu odstranit všechna slova, která končí číslicí, tudíž:
z textu:

"auto jede po silnici111"
bude
"auto jede po"

z textu

"tento den4 je super a slunicko47 sviti"
bude
"testo je super a sviti"

šlo by vytvořit takový regex, který by to odstranil z řetězce? Vůbec mě nenapadá jak a proto prosím o radu. Děkuji
Taps
Profil
nevimjakdal:
vyzkoušej níže uvedené
$text = 'tento den4 je super a slunicko47 sviti';
$text2 = preg_replace('/([a-zA-Z]+[0-9]{1,5})/m','',$text);
echo $text2;
Tomášeek
Profil
Taps:
To nebude asi úplně ono. Nahradí to i slova s čísly uprostřed (např. "den4a"). Nanahradí to slova s šestičíslím na konci (např. "den412345").
Kajman
Profil
A i sluníčko47 by to neodstranilo. Snad půjde
'/\b\w+\d+\b/u'
Keeehi
Profil
Kajman:
Toto je podle mě správný směr. A zde popsané případy by to mělo bezpečně nahradit. Ovšem nevimjakdal úplně neřekl, jak naložit třeba s kol1toč33. Protože to je taky slovo končící číslicí. Pokud by chtěl odstranit i to, musel by regulár vypadat trochu jinak.
nevimjakdal
Profil *
Děkuji. Jde jen o slova, která mají číslo na konci, nemělo by se stát, že v řetězci bude nějaké slovo, které má číslici na začátku/uprostřed
Kajman
Profil
Ten regulár z [#4] ostraní i slovo kol1toč33. Spíš je problém, že každé slovo, co končí číslicí, takže i každé víceciferné číslo. Což nevím, jestli opravdu chcete.
phpio.net/s/9dtz
nevimjakdal
Profil *
Aha, tak to je problém :/ Je možnost tam přidat podmínku, že před tou číslicí musí být třeba dva a více znaků a-z A-Z? Omlouvám se, pokud to regulerní výraz nepodporuje, nenapadá mě jiné řešení.
Kajman
Profil
Taky si nejsem jistý, ale určitě to půjde testovat až ve druhém kole...

$text = 'tento kol1toč33 je super, slunicko47 svití a je 42 stupnu';
$text2 = preg_replace_callback(
        '/\b\w+\d+\b/u',
        function ($matches) {
            return preg_match('/^\d+$/u', $matches[0]) ? $matches[0] : '';
        },
        $text
    );
echo $text2;
Keeehi
Profil
nevimjakdal:
před tou číslicí musí být třeba dva a více znaků a-z A-Z?
To není problém, ovšem do tohoto rozsahu nespadají znaky s diakritikou.

Kajman:
Já vždy zapomenu, že pod \w nepatří jen písmena ale i jiné znaky.


\w s modifikátorem u je vlastně jen zkrácený zápis pro [\p{L}\p{N}_]
Takže mi z toho nakonec vyšlo \b\w*[\p{L}_]+\w*\d+\b.

Je tu ještě jedna věc, podtržítko. aaa_bbb se bere jako jedno slovo. Na rozdíl od spojovníku nebo pomlčky které to rozdělují na dvě slova (propan-butan Zikmund–Hanzelka). Stojí tedy za to se zamyslet, jak se chovat k podtržítku. Co jsem našel, tak žádná typografická pravidla pro něj neplatí protože se obyčejném textu nevyskytuje. Tento znak přinesla doba počítačů a český jazyk ho oficiálně snad zatím nijak neadaptoval. Osobně bych se spíše klonil k variantě, že i podtržítko rozděluje dvě slova. Pokud by jsi to tak chtěl, pak by regulár vypadal takto \b[\p{L}\p{N}]*[\p{L}]+[\p{L}\p{N}]*\d+\b
nevimjakdal
Profil *
Použiju to, co bere _ jako dvě slova, to bude asi nejlepší mi přijde. Děkuji moc a přeji hezký zbytek dne.

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