Valider 5893e481 rédigé par marcimat's avatar marcimat
Parcourir les fichiers

feat: Permettre de rechercher / remplacer par regexp

parent afdf13a5
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+9 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -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>
+35 −18
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -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 ($is_regexp)  {
				if ($sensible) {
				$v = str_replace($search, $replace, $row[$c], $nb);
					$v = preg_replace('/' . $search . '/s', $replace, $row[$c], -1, $nb);
				} else {
					$v = preg_replace('/' . $search . '/si', $replace, $row[$c], -1, $nb);
				}
			else {
			} 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)

+2 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -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 d’utiliser 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)',