作成日:2018-02-21, 更新日:2021-04-14
やりたいこと
・HTMLのscriptタグの中で使われている「<」を「<」に変換したい。
「preg_replace_callback()」でいけそうな気がしたんだけど、未熟者なので挫折した。
代案として、マッチする箇所すべて抜き出して置き換える。
▼流れ
・scriptタグをマルっと取得
・中身に「<」を含むscriptタグをマルっと取得
・scriptタグの中身があれば中身を置き換え
・中身を置き換えたscriptタグを元に戻す
▼修正済み
$source = 〇〇〇; $regex = '/<script[^>]*?>([^<]*<[^\/][\s\S]*?)<\/script>/ui'; preg_match_all($regex, $source, $m, PREG_SET_ORDER); foreach ( $m as $rowM ) { $tmpScript = str_replace($rowM[1], str_replace('<', '<', $rowM[1]), $rowM[0]); $source = str_replace($rowM[0], $tmpScript, $source); }
▼没:2018/02/21
$source = 〇〇〇; $regex = '/<script[^>]*?>([\s\S]*?)<\/script>/ui'; preg_match_all($regex, $source, $m, PREG_SET_ORDER); foreach ( $m as $rowM ) { if ( $rowM[1] != '' ) { $tmpScript = str_replace($rowM[1], str_replace('<', '<', $rowM[1]), $rowM[0]); $source = str_replace($rowM[0], $tmpScript, $source); } }
メモ
$tmpScript = str_replace($rowM[1], str_replace('<', '<', $rowM[1]), $rowM[0])
▼バラした状態
$out = $rowM[0]; // タグ自体 $in = $rowM[1]; // タグの中身 // タグの中身を置き換え $replace = str_replace('<', '<', $in); // タグ自体からタグの中身をまるっと差し替え $tmpScript = str_replace($in, $replace, $out);
$source = str_replace($rowM[0], $tmpScript, $source)
「全体」から「対象のタグ」を「中身を差し替えたタグ」で差し替え