Updating: If you do not want to open file by file, you can create a PHP script to scan a directory for HTML file or other case you want. See:
This script will be executed through Terminal / Powershell, then you will receive a parameter which will be the directory to be scanned. Use the function glob
to scan the directory, it will receive a parameter that will be "{$Dir}/*.html"
and will return an array if it has found something, if it does not, it will return an empty array and false
in case of error.
Before using the script below, make a backup!
// Conta quantos argumentos foi informado.
// O primeiro argumento sempre será o nome do arquivo.
$CountArgs = count($argv);
// Verifica se é menor que 2
if ($CountArgs < 2) {
echo "Informe um diretório!\n\n";
exit(0);
}
// Verifica se o argumento é um diretório.
else if ( !is_dir($argv[1]) ) {
echo "O parâmetro informado não é um diretório!\n\n";
exit(0);
}
// Guarda o argumento na variável.
$Dir = $argv[1];
// Varre o diretório atrás de arquivos html
// depois percorre a array e executa a função.
foreach (glob("{$Dir}/*.html") as $arquivo) {
alterar_links($arquivo);
}
function alterar_links($Arquivo) {
// Lê o arquivo, e guarda o conteúdo na variável
$Conteudo = file_get_contents($Arquivo);
// Faz a busca usando a expressão regular
// e modifica usando um callback
$Alteracoes = preg_replace_callback("|<li>([\w\s]+)<a(.*?)>(.*?)<\/li>|",
function($retorno) {
return "<li><a{$retorno[2]}>{$retorno[1]}</a></li>";
},
$Conteudo);
// Abre o arquivo em modo escrita
$arquivo = fopen($Arquivo,'w+');
// Escreve as alterações no arquivo
fwrite($arquivo, $Alteracoes);
// Fecha
fclose($arquivo);
}
Important: Note that when making the change, I’m not leaving space between the tag li
and the tag a
: <li><a{$retorno[2]}>{$retorno[1]}</a></li>
. Thus, if the script reads the file again, it makes no changes.
References:
Sublime Text
You can use Regular Expressions to speed up the process, see:
<li>([\w\s]+)<a(.*?)>(.*?)<\/li>$
Explanation:
(.*?)
: Captures text within tag "a" including tag closure
<a(.*?)>
: Captures "a tag attributes"
([\w\s]+)
: Captures the text before the "a"
To use in Sublime Text, press CTRL+H
afterward ALT+R
to activate the Regular Expressions search, in the Find field put the above code, already in the Replace field:
<li><a$2>$1</a></li>
Explanation:
- $1: Puts the captured text before the "a"
- $2: Puts captured attributes from tag "a"
Note that I used [\w\s]+
instead of [a-zA-Z0-9 ]+
because then you get back everything that is before, already [a-zA-Z0-9 ]+
will capture only letters, numbers and spaces.
Using Sublime vc would do it well, he tbm uses regular expressions to select areas, I used several times this idea
– Wees Smith
Can you give me an example of how I would do @Weessmith? No regex manjo
– Jorge.M
Research:
<li>([a-zA-Z0-9 ]+)<a(.*?)>(.*?)+<\/li>$
and the replace:<li><a$2>$1</a></li>
something like this, see this example: https://regexr.com/3pedc– NoobSaibot