fork download
  1. <?php
  2.  
  3. // look ma no arrays
  4. function getVarName($dsnKey)
  5. {
  6. switch ($dsnKey) {
  7. case 'login':
  8. return 'user';
  9. case 'pass':
  10. return 'password';
  11. }
  12. // эта зубодробительная конструкция влегкую заменяется одним массивом
  13. return null;
  14. }
  15.  
  16. // нет, в функцию не оформлю, там массив и extract потребуются. либо вообще global.
  17.  
  18. $dsn = 'login=Admin;;;pass:123123;;some;;var=1234';
  19. while ($dsn) {
  20. $pos = strpos($dsn, ';');
  21. if ($pos === false) {
  22. $chunk = trim($dsn);
  23. $dsn = false;
  24. } else {
  25. $chunk = trim(substr($dsn, 0, $pos));
  26. $dsn = trim(substr($dsn, $pos + 1));
  27. }
  28. $eqSignPos = strpos($chunk, '=');
  29. $semicolonPos = strpos($chunk, ':');
  30. $fail = !$eqSignPos && !$semicolonPos; // нам не нужны ни оба false, ни разделителя в начале строки
  31. $fail = $fail || ($eqSignPos > 0 && $semicolonPos > 0); // если у нас два разделителя, то тоже паникуем
  32. if (empty($chunk) || $fail) {
  33. continue;
  34. }
  35. $delimPos = max($eqSignPos, $semicolonPos); // чому бы и не
  36. $varKey = substr($chunk, 0, $delimPos);
  37. $value = substr($chunk, $delimPos + 1);
  38. $varName = getVarName($varKey);
  39. if ($varName) {
  40. $$varName = $value;
  41. echo sprintf('Successfully set variable %s (%s) with %s value'.PHP_EOL, $varKey, $varName, $value);
  42. } else {
  43. echo sprintf('Variable %s hasn\'t been set'.PHP_EOL, $varKey, $varName);
  44. }
  45. }
Success #stdin #stdout 0.01s 20520KB
stdin
Standard input is empty
stdout
Successfully set variable login (user) with Admin value
Successfully set variable pass (password) with 123123 value
Variable var hasn't been set