Autor Zpráva
Fisir
Profil
Potřebuju sestavit regulární výraz, který vybere řádky, které nezačínají BB tagem [dd] nebo [dt]. Toto bych zvládal:
/^(\s*(?!\s*\[d(?:t|d)\]).*?)$/Smu
Teď ale nastává problém, protože pokud mám text typu
[dt]Test[/dt]
Text na dva
řádky.
najde mi to oba dva řádky zvlášť. Já bych ale chtěl, aby mi to našlo v jedné shodě ty dva řádky dohromady. Modifikátor s ani nahradit . za [\n.] nefunguje. Jde to vůbec?
juriad
Profil
Šel bych na to úplně jinak. Předpokládám, že tě zajímá vše kromě úseků [dt]....[/dt] a [dd]....[/dd] ať už jsou v textu kdekoli:
$text="[dt]Test[/dt]
Text na dva
řád[dd]ky[/dd].
[dd]Něco[/dd]
Ještě něco jiného
[dt]Dlouhý
term[/dt]";

var_dump(preg_split('#^\[(d[dt])\].*?\[/\1\]$#ms', $text));

Pokud chceš, vyhodit jen termy a definice, které začínají na začátku řádky a končí na konci, přidej tmavě zvýzněné části. Pokud může term nebo definice být víceřádková, přidej ještě modifikátor s.
Fisir
Profil
Reaguji na juriada:
Aha, moje chyba, omlouvám se. Nechci ty úseky bez [dd] nebo [dt] vybírat, ale chci je uzavřít do [dd], tedy ten regulární výraz potřebuji použít ve funkci preg_replace. Tenhle mi sice ty řádky vybere, ale nemůžu s ním dělat nahrazení. Potřebuji tedy přesně opačný výraz.
juriad
Profil
$text="[dt]Test[/dt]
Text na dva
řád[dd]ky[/dd].
[dd]Něco[/dd]
Ještě něco jiného
[dt]Dlouhý
term[/dt]
Volný konec";

var_dump(preg_replace('#^(?!\[d[dt]\])(.*?)(?=\n\[d[dt]\])#sm', '[xx]\1[/xx]', $text));

Toto funguje, až na ten volný konec. To by šlo obejít přidáním nějaké značky na konec (třeba [dt][/dt]) a to po transformaci prázdné termy smazat).
Fisir
Profil
Reaguji na juriada:
Paráda. Díky!

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