2010-08-14 4 views
1

Ceci est un exemple de texte provenant d'un grand fichier texte.Expression régulière PHP remplaçant les calculs

(2, 1, 3, 2, 'text...','other text...', 'more text...', ...), 
(3, 1, 3, 2, 'text...','other text...', 'more text...', ...), 
(4, 1, 3, 2, 'text...','other text...', 'more text...', ...), 
(5, 1, 3, 2, 'text...','other text...', 'more text...', ...), 
(6, 1, 3, 2, 'text...','other text...', 'more text...', ...), 

Maintenant je dois ajouter 19 à chaque valeur de la première colonne ...

(21, 1, 3, 2, 'text...','other text...', 'more text...', ...), 
(22, 1, 3, 2, 'text...','other text...', 'more text...', ...), 
(23, 1, 3, 2, 'text...','other text...', 'more text...', ...), 
(24, 1, 3, 2, 'text...','other text...', 'more text...', ...), 
(25, 1, 3, 2, 'text...','other text...', 'more text...', ...), 

preg_replace_callback() semble la solution, mais je ne suis pas vraiment utilisé à des expressions régulières ...

Répondre

1
preg_replace_callback(
    '/(?<=\()(\d+)(?=,.+\),?\v)/', 
    function($match) { 
     return (string)($match[1]+19); 
    }, 
    $large_text 
); 
+0

Merci beaucoup! (Les expressions régulières me rendent un peu étourdi) – Glenn

+0

Mais pourriez-vous s'il vous plaît expliquer le reg. expression que vous avez utilisée? – Glenn

+0

'(? <= \()' Cherche une parenthèse de début comme repère pour le début de l'expression à remplacer mais n'est pas incluse dans l'expression à remplacer - mais seulement les chiffres signifiés par '(\ d +)'. Le reste de la regex vérifie juste qu'une virgule après les chiffres est présente jusqu'à des parenthèses, une virgule optionnelle (dans le cas où c'est la dernière ligne), et un saut de ligne, ou un espace vertical, comme signifié par le '\ v' . '(? =,. + \),? \ v)' signifie que cela ne fait pas partie de l'expression à remplacer. – stillstanding

0

Ceci le ferait pour stdin.

// Your function 
function add19($line) { 
    $line = preg_replace_callback(
     '/^\(([^,]*),/', 
     create_function(
      // single quotes are essential here, 
      // or alternative escape all $ as \$ 
      '$matches', 
      'return ("(" . (intval($matches[1])+19) . ",");' 
     ), 
     $line 
    ); 
    return $line; 
} 

// Example reading from stdin 
$fp = fopen("php://stdin", "r") or die("can't read stdin"); 
while (!feof($fp)) { 
    $line = add19(fgets($fp)); 
    echo $line; 
} 
fclose($fp);