WordPress

連続した改行を正規表現を使って消す(不要なPタグの自動挿入を防ぐ)

WordPress の記事やコメントの「連続した改行部分」に自動で挿入される<p>タグを消す件です。すでにどちらさまもremove_filterwpautopを無効にしたりしてると思うんですが、今回はコメントからそもそもの改行を取り除いたメモです。

ググッてみた結果ですが、とりあえずは「フィルターを無効にする」が主な対策かと思います。

remove_filter( 'the_content', 'wpautop' );
remove_filter( 'the_excerpt', 'wpautop' );

という具合にwpautopフィルターを無効にします。これで投稿の際、記事や抜粋に自動で<p>タグが入らなくなります。
関数リファレンス_wpautop - WordPress Codex 日本語版

ただ、Codex にも
> WordPress はこの関数を投稿や固定ページの本文と抜粋のフィルターに使用します。
とあるんですが、テーマのせいなのか何なのか、コメントでも wpautopが効いてしまっていました。

ちゃんと調べれば、コメントのwpautopフィルターを呼ばないようにできるかもしれないんですが、「そもそもコメントに改行の連打をされるのはイヤ」なので、コメントについてはHTMLもダメにして連続した改行そのものを取り除くことにしました。

テーマの functions.php に

function comment_htmlize ( $str ) {
  if ( get_comment_type() != 'comment' ) return $str
  // HTMLエスケープ
  $str = htmlspecialchars($str, ENT_QUOTES);

  // Pタグの自動挿入を防ぐ ※ 連続する改行(前後のタブorスペースも)を消す
  $str = preg_replace ( '/(?:[\s\t]*(?:\rn|\n|\r)[\s\t]*){2,}/', "\n", $str );
  return $str;
}
add_filter( 'comment_text',     'comment_htmlize', 9); // コメント
add_filter( 'comment_text_rss', 'comment_htmlize', 9); // フィードで使われるコメント内容
add_filter( 'comment_excerpt',  'comment_htmlize', 9); // コメントの抜粋

を書いてコメントを洗うようにしました。

連続する改行の前後にタブやスペースが混じっていてもうまく<p>タグが挿入されていたので正規表現で改行の置換を行います。関数では、htmlspecialcharsでHTMLエスケープした後、「周りにタブかスペースが混じっているかもしれない改行が2個以上連続」の検索パターンを「一つの改行」に置換して文字列を返します。

もともとPerlに慣れているので、PHPやJavaScriptでは正規表現では少し苦労しますが、もっといい方法があれば教えていただければと思います。