作成日:2018-02-13, 更新日:2018-02-22
基本
「preg_replace_callback()」のコールバック関数内で置き換える感じなので「preg_replace_callback(範囲, function(置き換え), 文字列)」のような感じにする。
▼ulタグ内の「<」を「<」にしたい場合。
$str = '<ul>' . "\n" . '<li><a href="〇〇〇">XXX</a></li>' . "\n" . '<li><a href="〇〇〇">XXX</a></li>' . "\n" . '<li><a href="〇〇〇">XXX</a></li>' . "\n" . '<li><a href="〇〇〇">XXX</a></li>' . "\n" . '<li><a href="〇〇〇">XXX</a></li>' . "\n" . '</ul>' . "\n" . '<ol>' . "\n" . '<li><a href="〇〇〇">XXX</a></li>' . "\n" . '<li><a href="〇〇〇">XXX</a></li>' . "\n" . '<li><a href="〇〇〇">XXX</a></li>' . "\n" . '<li><a href="〇〇〇">XXX</a></li>' . "\n" . '<li><a href="〇〇〇">XXX</a></li>' . "\n" . '</ol>' . "\n"; $sorce = preg_replace_callback( '@<ol>(.+?)<\/ol>@s', function ($m) { return str_replace('<', '<', $m[0]); }, $str );
基本:改
上記で大丈夫じゃないときがある・・・。
没(2018/02/13):各scriptタグ内の「<」を「<」に変換
下記だと希望通りの挙動にはなってくれないので、作り直した(2018/02/21:参照:PHP 特定のタグの中身をゴニョゴニョしたい(preg_match_all()とstr_replace())」
▼内容
・「<script>」と「<script type=〇〇〇>」などを考慮・・・「<script( *| .+?)>」
・scriptタグの中身を取得したい・・・「(.+?)」
・scriptタグが複数ある場合を考慮・・・最短一致「?(<\/script>)」
・UTF8のおまじない・・・「u」
・「script」の大文字・小文字を考慮・・・「i」
$str = @file_get_contents(〇〇〇); function parseTagsRecursive($input) { $regex = '/<script( *| .+?)>(.+?)?(<\/script>)/ui'; if (is_array($input)) { $input = str_replace('<', '<', $input[2]); } return preg_replace_callback($regex, 'parseTagsRecursive', $input); } $result = parseTagsRecursive($str); echo $result;
※「PHPの公式(preg_replace_callback()の例3)に載っていたソース」をカスタマイズ。
日本語を「urlencode()」したい
・URLの日本語のトコ(全角文字・半角カナ)だけ「urlencode()」したい
function parseTagsRecursive($input) { $regex = '/[^\x01-\x7E]/u'; // 「1バイト文字を除く」→全角文字 if (is_array($input)) { $input = urlencode($input[0]); } return preg_replace_callback($regex, 'parseTagsRecursive', $input); }
・URLをパースして、「urlencode()」するのがいいんだろうけど・・・クエリなどを考えると面倒だから避けたい。
・日本語ドメインは非対応。あらかじめPUNYコードに変換しておく。