feat: Permettre de rechercher / remplacer par regexp

master v2.0.0
Matthieu Marcillaud 7 months ago
parent afdf13a50c
commit 5893e481ff

@ -28,6 +28,15 @@
<label for="#GET{name}">[(#GET{fl}|concat{':label_',#GET{name}}|_T)]</label>
</div>
</div>
#SET{name,regexp}#SET{obli,''}#SET{defaut,''}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
<div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
#SET{val,yes}
<div>
<input type="checkbox" name="#GET{name}" class="checkbox" id="#GET{name}" value="#GET{val}" [(#GET{val}|=={#ENV{#GET{name},''}}|oui)checked="checked"]/>
<label for="#GET{name}">[(#GET{fl}|concat{':label_',#GET{name}}|_T)]</label>
<div class="explication">[(#GET{fl}|concat{':label_',#GET{name},'_explication'}|_T)]</div>
</div>
</div>
#SET{name,search_tables}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
<div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
<label>[(#GET{fl}|concat{':label_',#GET{name}}|_T|label_ponctuer)]</label>

@ -29,6 +29,7 @@ function formulaires_rechercher_remplacer_charger_dist() {
'replace_yes' => '',
'replace' => '',
'sensible' => '',
'regexp' => '',
'tables_exclues' => [
'spip_messages',
'spip_depots',
@ -40,16 +41,21 @@ function formulaires_rechercher_remplacer_charger_dist() {
return $valeurs;
}
/** @return array */
function formulaires_rechercher_remplacer_options() {
return [
'sensible'=> (bool) _request('sensible'),
'regexp'=> (bool) _request('regexp'),
'tables' => array_filter((array) (_request('search_tables') ?? [])),
];
}
/**
* @return array
*/
function formulaires_rechercher_remplacer_verifier_dist() {
$erreurs = [];
$options = [
'sensible'=> (bool) _request('sensible'),
'tables' => array_filter((array) (_request('search_tables') ?? [])),
];
$options = formulaires_rechercher_remplacer_options();
if (!_request('search')) {
$erreurs['search'] = _T('info_obligatoire');
@ -81,10 +87,7 @@ function formulaires_rechercher_remplacer_verifier_dist() {
function formulaires_rechercher_remplacer_traiter_dist() {
$res = [];
$options = [
'sensible'=> (bool) _request('sensible'),
'tables' => array_filter((array) (_request('search_tables') ?? [])),
];
$options = formulaires_rechercher_remplacer_options();
// remplacer si demande
if (_request('remplacer') and _request('replace_yes')) {
@ -191,17 +194,23 @@ function rechremp_search_and_replace($search, $replace = null, $do_replace = fal
* @param array $options tableau d'options. Index possible : 'sensible'
* @return string liste présentant les résultats de la recherche
*/
function rechremp_search_and_replace_table($table, $champs, $search, $replace = null, $do_replace = false, $options=array()) {
function rechremp_search_and_replace_table($table, $champs, $search, $replace = null, $do_replace = false, $options = []) {
if (!count($champs) or !$search) {
return '';
}
$sensible = isset($options['sensible']) and $options['sensible'];
$sensible = $options['sensible'];
$is_regexp = $options['regexp'];
$preg_sensible = ($sensible ? '' : 'i');
$len = intval(RECHREMP_CONTEXTE_NB_CHARS);
$len_moins_un = max($len-1, 0);
$pattern = "/(^.{0,$len_moins_un}|.{".$len.'})('.preg_quote($search, '/').")(.{0,$len_moins_un}$|.{".$len.'})/s'.$preg_sensible;
$query = ($is_regexp ? $search : preg_quote($search, '/'));
$pattern = "/(^.{0,$len_moins_un}|.{".$len.'})('
. $query
. ")(.{0,$len_moins_un}$|.{".$len.'})/s'.$preg_sensible;
// Par exemple : "/(^.{0,9}|.{10})ma recherche(.{0,9}$|.{10})/s"
include_spip('action/editer_objet');
@ -217,16 +226,24 @@ function rechremp_search_and_replace_table($table, $champs, $search, $replace =
$res = sql_select($select, $table);
while ($row = sql_fetch($res)) {
$set = array();
$set = [];
foreach ($champs as $c) {
$nb = 0;
if ($sensible) {
$v = str_replace($search, $replace, $row[$c], $nb);
}
else {
$v = str_ireplace($search, $replace, $row[$c], $nb);
if ($is_regexp) {
if ($sensible) {
$v = preg_replace('/' . $search . '/s', $replace, $row[$c], -1, $nb);
} else {
$v = preg_replace('/' . $search . '/si', $replace, $row[$c], -1, $nb);
}
} else {
if ($sensible) {
$v = str_replace($search, $replace, $row[$c], $nb);
} else {
$v = str_ireplace($search, $replace, $row[$c], $nb);
}
}
// si on a confirmé un remplacement, $v est le résultat du remplacement
// sinon c'est $nb seulement qui nous intéresse ($v est inutilisable car $replace est vide)

@ -25,6 +25,8 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
// L
'label_replace' => 'Remplacer par',
'label_replace_yes' => 'Remplacer',
'label_regexp' => 'La recherche est une expression régulière ?',
'label_regexp_explication' => 'Il sera possible dutiliser les captures dans le champ de remplacement ($0, $1, ...)',
'label_search' => 'Rechercher',
'label_search_tables' => 'Tables',
'label_search_tables_explication' => 'Cocher pour limiter à certaines tables (sinon toutes)',

Loading…
Cancel
Save