ラボ > PHP:文字関連

PHP 特定のタグの中身をゴニョゴニョしたい(preg_match_all()とstr_replace())

特定の文字じゃなく、タグの中身をゴニョゴニョしたい。

作成日:2018-02-21, 更新日:2021-04-14

やりたいこと

・HTMLのscriptタグの中で使われている「<」を「&lt;」に変換したい。

「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('<', '&lt;', $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('<', '&lt;', $rowM[1]), $rowM[0]);
      $source = str_replace($rowM[0], $tmpScript, $source);
   }
}

メモ

$tmpScript = str_replace($rowM[1], str_replace('<', '&lt;', $rowM[1]), $rowM[0])

▼バラした状態

$out = $rowM[0]; // タグ自体
$in  = $rowM[1]; // タグの中身

// タグの中身を置き換え
$replace = str_replace('<', '&lt;', $in);

// タグ自体からタグの中身をまるっと差し替え
$tmpScript = str_replace($in, $replace, $out);

$source = str_replace($rowM[0], $tmpScript, $source)

「全体」から「対象のタグ」を「中身を差し替えたタグ」で差し替え