Autor Zpráva
Lochnan
Profil
Ahoj, mám v proměnné textově uloženy tyto data:

$str = '
    $lang['wss_texts_cis_15'] = 'Nějaká událost';
    $lang['wss_texts_cis_16'] = 'Nějaká = událost \' jiná';
';

a potřeboval bych z toho dostat vždycky klíč a hodnotu, pro další zpracování. Zkoušel jsem to spustit jako eval, ale nepovedlo se. Takže další způsob mě napadl preg_match_all ale nepovedlo se mi nikdy ošetřit, že v hodnotě pole může být taktéž znak =, nebo escapované uvozovky. Dá se toto nějak elegantně řešit, že bych ve výstupu měl něco (třeba) takovéhoto:?

$output = array(0 => array('wss_texts_cis_15' => 'Nějaká událost'), 1=> array('wss_texts_cis_16' => 'Nějaká = událost \' jiná'));
juriad
Profil
Máš-li to v souboru a nikoli jen v proměnné, můžeš ten soubor prostě includnout a tím se ti naplní pole $lang.
Lochnan
Profil
juriad:
Bohužel, tento obsah mi přijde jako string v POST proměnné.
Fisir
Profil
Reaguji na Lochnana:
Tak hlavně je tam nějaký mišmaš v apostrofech. Ale rychle jsem sestavil parsovací funkci, je to bezpečnější než eval():
function convertStringToArray($string){
    $result = preg_match_all('/\$([a-zA-Z_\x7f-\xff]+)\[["\'](.+)["\']\]\s*=\s*["\'](.+)["\'];/u', $string, $matches, PREG_SET_ORDER);
    $return = array();
    foreach($matches as $match){
        $return[$match[1]][$match[2]] = $match[3];
    }
    return $return;
}
Použiješ ji:
$promenna = '$lang[\'hello\'] = "ahoj";
$variable["y \" fd y"] ="gangam stajl ";';
$result = convertStringToArray($promenna);
A var_dump($result) vrací:
array(2) {
    ["lang"]=> array(1) {
        ["hello"]=> string(4) "ahoj"
    }
    ["variable"]=> array(1) {
        ["y \"s p"]=> string(13) "gangam stajl "
    }
}
Opraveno pro použití s jakoukoli proměnnou, ale nefunguje to, když mezi jednotlivými definicemi proměnných není ukončený řádek.
Místo mezer se chytnou jakékoli bílé znaky.
Lochnan
Profil
Fisir:
Díky moc, na reguláry jsem slabej :) Funguje tak jak 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