Autor Zpráva
Jack06
Profil
Dobrý den, potřebuju rozdělit text do array pole a zajímalo by mě, jak to šikovně udělat. Text může být následovný:

Ahoj já jsem pepa [block] něco v bloku [/block] Jedu domů šalinou [block] test test [/block].

A potřebuji to do pole následovně:

$pole[0] = 'Ahoj já jsem pepa';
$pole[1] = 'něco v bloku';
$pole[2] = 'Jedu domů šalinou';
$pole[3] = 'test test';

atd atd


Moc děkuji za rady.
Marek88
Profil
Rozdělit třeba pomocí preg_split s regulárem. Snad je to dobře...
$pole=preg_split("~\[/?block\]~", $text);
lukasik
Profil
tak mě napadá - nestačilo by explode?
Jack06
Profil
no trochu jsem to napsal tak, že to asi splitem nepujde.. Opravuju záznam:

Ahoj já jsem pepa [block id="1"]něco v bloku[/block] Jedu domů šalinou [block id="10"]test test[/block].  atd

$pole[0][text] = 'Ahoj já jsem pepa';
$pole[0][id] = NULL;
$pole[1][text] = 'něco v bloku';
$pole[1][id] = 1;
$pole[2][text] = 'Jedu domů šalinou';
$pole[2][id] = NULL;
$pole[3][text] = 'test test';
$pole[3][id] = 10;
Majkl578
Profil
Vyřešeno mimo diskuzi, řešení (pokud by někoho zajímalo):

$s = 'Ahoj já jsem pepa [block param1="foo" param2="bar"]něco v bloku[/block] Jedu domů šalinou [block]test test[/block].';
$m = preg_split('~(\[block(?:.*)\](?:.+)\[/block\])~Uis', $s, -1, PREG_SPLIT_DELIM_CAPTURE);
$m = array_map(function ($s) {
    if (preg_match('~\[block(?: (?<params>.+))?\](?<text>.+)\[/block\]~Uis', $s, $m)) {
        $params = array();
        if (!empty($m['params'])) {
            if (preg_match_all('~(\S+)="(.+)"~U', $m['params'], $mp, PREG_PATTERN_ORDER)) {
                $params = array_combine($mp[1], $mp[2]);
            }
        }
        return array('text' => $m['text']) + $params;
    } else {
        return array('text' => $s);
    }
}, $m);
var_dump($m);

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