pagetop

BLOG

【php】特定のディレクトリ内の全てのファイル操作をバッチで処理する

  • HOME

  • BLOG

  • 【php】特定のディレクトリ内の全てのファイル操作をバッチで処理する

Article

【php】特定のディレクトリ内の全てのファイル操作をバッチで処理する

PHP

GAなど、全てのファイルに記載されているプラグインのアップデート時に書き換えが必要になることありますよね。
インクルードファイルのみの差し替えでクリアできない問題が発生した際、当然ですが1ファイルごとの処理はリスクが高いので、できればバッチ処理したいなんてこともあります。
そんな時使えるphpをメモします。

 

共通のテキストを指定の場所に追加する

body直下に共通のテキストを追加します。

php

<?php
$directory = 'addition/'; // 操作するディレクトリのパス
$textToInsert = '共通のテキスト'; // 挿入するテキスト

// ディレクトリ内のファイルを取得
$files = scandir($directory);

foreach ($files as $file) {
if ($file !== '.' && $file !== '..') {
$filePath = $directory . $file;

// ファイルが存在し、ディレクトリではない場合に処理を行う
if (is_file($filePath)) {
// ファイルの内容を取得
$content = file_get_contents($filePath);

// <body>タグの直下にテキストを挿入
$modifiedContent = preg_replace('/(<body\b[^>]*>)/i', '$1' . $textToInsert, $content);

// 変更をファイルに書き込み
file_put_contents($filePath, $modifiedContent);
}
}
}

echo 'バッチ処理が完了しました。';
?>

これを実行すると、additionディレクトリ内にある全てのhtmlファイルのbody直下に「共通のテキスト」というテキストが入ります。

実行前

<body>
<div class="wrap">

</div>
</body>

実行後

<body>共通のテキスト
<div class="wrap">

</div>
</body>

 

共通のテキストを削除する

挿入されている共通のテキストを全て削除します。

php

<?php
$directory = 'delete/'; // 操作するディレクトリのパス
$textToRemove = '削除するテキスト'; // 削除するテキスト

// ディレクトリ内のファイルを取得
$files = scandir($directory);

foreach ($files as $file) {
if ($file !== '.' && $file !== '..') {
$filePath = $directory . $file;

// ファイルが存在し、ディレクトリではない場合に処理を行う
if (is_file($filePath)) {
// ファイルの内容を取得
$content = file_get_contents($filePath);

// テキストを削除
$modifiedContent = str_replace($textToRemove, '', $content);

// 変更をファイルに書き込み
file_put_contents($filePath, $modifiedContent);
}
}
}

echo 'バッチ処理が完了しました。';
?>

これを実行すると、deleteディレクトリ内にある全てのhtmlファイルに挿入されている「削除するテキスト」が削除されます。

実行前

<body>
<div class="wrap">
削除するテキスト 
</div>
</body>

実行後

<body>共通のテキスト
<div class="wrap">

</div>
</body>

 

共通のテキストを置換する

挿入されている共通のテキストを全て別のテキストに置換します。

php

<?php
$directory = 'replacement/'; // 操作するディレクトリのパス
$textToReplace = 'あいうえお'; // 置換前のテキスト
$replacementText = 'ABCDE'; // 置換後のテキスト

// ディレクトリ内のファイルを取得
$files = scandir($directory);

foreach ($files as $file) {
if ($file !== '.' && $file !== '..') {
$filePath = $directory . $file;

// ファイルが存在し、ディレクトリではない場合に処理を行う
if (is_file($filePath)) {
// ファイルの内容を取得
$content = file_get_contents($filePath);

// テキストを置換
$modifiedContent = str_replace($textToReplace, $replacementText, $content);

// 変更をファイルに書き込み
file_put_contents($filePath, $modifiedContent);
}
}
}

echo 'バッチ処理が完了しました。';
?>

これを実行すると、replacementディレクトリ内にある全てのhtmlファイルに挿入されている「あいうえお」が「ABCDE」に置換されます。

実行前

<body>
<div class="wrap">
あいうえお 
</div>
</body>

実行後

<body>共通のテキスト
<div class="wrap">
ABCDE 
</div>
</body>

 

特定のclassの中にある共通テキストを置換する

特定のclassを取得し、その中にある半角英数字を別のテキストに置換します。

php

<?php
$directory = 'replacement/'; // 操作するディレクトリのパス
$textToReplace = 'あいうえお'; // 置換前のテキスト
$replacementText = 'ABCDE'; // 置換後のテキスト

// ディレクトリ内のファイルを取得
$files = scandir($directory);

foreach ($files as $file) {
if ($file !== '.' && $file !== '..') {
$filePath = $directory . $file;

// ファイルが存在し、ディレクトリではない場合に処理を行う
if (is_file($filePath)) {
// ファイルの内容を取得
$content = file_get_contents($filePath);

// テキストを置換
$modifiedContent = str_replace($textToReplace, $replacementText, $content);

// 変更をファイルに書き込み
file_put_contents($filePath, $modifiedContent);
}
}
}

echo 'バッチ処理が完了しました。';
?>

これを実行すると、replacementディレクトリ内にある全てのhtmlファイルのセレクタ「container」の中にある「あいうえお」を「ABCDE」に置換します。

実行前

<body>
<div class="wrap">
あいうえお
<div class="container">
あいうえお
</div>
</div>
</body>

実行後

<body>
<div class="wrap">
あいうえお
<div class="container">
ABCDE
</div>
</div>
</body>

 

特定のclassの中にある半角英数字を置換する

特定のclassを取得し、その中にある半角英数字を別のテキストに置換します。

php

<?php
$directory = 'replacement_class_en/'; // 操作するディレクトリのパス
$targetClass = 'container'; // 対象のクラス

// ディレクトリ内のファイルを取得
$files = scandir($directory);

foreach ($files as $file) {
if ($file !== '.' && $file !== '..') {
$filePath = $directory . $file;

// ファイルが存在し、ディレクトリではない場合に処理を行う
if (is_file($filePath)) {
// ファイルの内容を取得
$content = file_get_contents($filePath);

// 対象クラス内の半角英数字のみを置換
$modifiedContent = preg_replace_callback('/<div class="' . $targetClass . '">(.*?)<\/div>/s', function ($matches) use ($targetClass) {
$replacement = preg_replace('/[A-Za-z0-9]+/', '置換文字', $matches[1]);
return '<div class="' . $targetClass . '">' . $replacement . '</div>';
}, $content);

// 変更をファイルに書き込み
file_put_contents($filePath, $modifiedContent);
}
}
}

echo 'バッチ処理が完了しました。';
?>

これを実行すると、replacement_class_enディレクトリ内にある全てのhtmlファイルのセレクタ「container」の中にある半角英数字を「置換文字」に置換します。
半角英数字は正規表現「/[A-Za-z0-9]+/」で取得します。

実行前

<body>
<div class="wrap">
あいうえおABCDE123456
<div class="container">
あいうえおABCDE123456
</div>

実行後

<body>
<div class="wrap">
あいうえおABCDE123456
<div class="container">
あいうえお置換文字
</div>
</body>

 

特定のclassの中にあるURLとメールアドレスを置換する

特定のclassを取得し、その中にあるURLとメールアドレスを別のテキストに置換します。

php

<?php
$directory = 'replacement_class_url_mail/'; // 操作するディレクトリのパス
$targetClass = 'container'; // 対象のクラス

// ディレクトリ内のファイルを取得
$files = scandir($directory);

foreach ($files as $file) {
if ($file !== '.' && $file !== '..') {
$filePath = $directory . $file;

// ファイルが存在し、ディレクトリではない場合に処理を行う
if (is_file($filePath)) {
// ファイルの内容を取得
$content = file_get_contents($filePath);

// 対象クラス内の半角英数字のみを置換
$pattern = '/<div class="' . $targetClass . '">(.*?)<\/div>/s';
$modifiedContent = preg_replace_callback($pattern, function ($matches) use ($targetClass) {
$replacement = preg_replace_callback('/https?:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+/', function ($urlMatches) {
return 'URL置換文字';
}, $matches[1]);
$replacement = preg_replace_callback('/([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})/', function ($emailMatches) {
return 'メールアドレス置換文字';
}, $replacement);
return '<div class="' . $targetClass . '">' . $replacement . '</div>';
}, $content);


// 変更をファイルに書き込み
file_put_contents($filePath, $modifiedContent);
}
}
}

echo 'バッチ処理が完了しました。';
?>

これを実行すると、replacement_class_url_mailディレクトリ内にある全てのhtmlファイルのセレクタ「container」の中にあるURLはを「URL置換文字」に、メールアドレスは「メールアドレス置換文字」置換します。
URLは正規表現「/https?:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+/」、メールアドレス正規表現「/([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})/」で取得します。

実行前

<body>
<div class="wrap">
あいうえおABCDE123456<br>https://www.rootstyledesign.com/<br>info@rootstyledesign.com
<div class="container">
https://www.rootstyledesign.com/<br>info@rootstyledesign.com
</div>

</div>
</body>

実行後

<div class="wrap">
あいうえおABCDE123456<br>https://www.rootstyledesign.com/<br>info@rootstyledesign.com
<div class="container">
あいうえおABCDE123456<br>URL置換文字<br>メールアドレス置換文字
</div>

</div>
</body>

 

以上です。

何百、何千とファイルがある場合は有効利用できると思います。
ただ、ソースが複雑な場合、意図しない表示になることもあります。
こういったタスクは影響範囲が広いため、慎重に対応しましょう!

Spread the love