1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

tinymce6 いろいろあって頭の<p>タグとおしりの</p>タグを取りたい

Last updated at Posted at 2023-06-16

なんでそんなことしたいねん、という話ではあるが……。

理由

tinymce6になってから、必ず編集後にpタグが入るようになった。
DBに入れるときに普通に邪魔なのでpタグが取りたい。
ただし普通に文中にあるpタグは残したい。
どうしたらよいか。

結論

いろいろissueとか読んだけど絶対にpタグは入るらしいので、無理やり取る

const deleteItem = (
  stringList: string[],
  deleteString: string,
  isBack: boolean
): string[] => {
  const loopStrings = isBack ? [...stringList].reverse() : stringList;
  const loop = (list: string[], inspected: string[]): string[] => {
    if (isEmpty(list)) return inspected;
    const [head, ...tail] = list;
    if (head !== deleteString) return loop(tail, [...inspected, head ?? ""]);
    return [...inspected, ...tail];
  };
  const result = loop(loopStrings, []);
  return isBack ? result.reverse() : result;
};

これは再帰で文字を消すだけの関数でござる。
引数によって前からも後ろからも消せるでござる。

const deleteP = (stringList: string[]): string[] => {
  const delFirstP = deleteItem(stringList, "<p>", false);
  const delEndP = deleteItem(delFirstP, "</p>", true);
  return delEndP;
};

べつに関数にまとめるほどでもないがまとめてみたでござる。

  // tinyMCEからtextという変数に値を入れている
  const regex = /(<\/?[a-z]*>)/g;
  const parsed = text
    .trim()
    .split(regex)
  const deleted = deleteP(parsed);

こんな感じでtinyMCEから取得したtextをうまいことパースしてpタグの頭とおしりを消すことに成功したのだった。

しかし、もうちょっとスマートなやり方があるんじゃないかなぁ、といつも思う。
普通に文字をstring[]にしてfindかなんかで消したらよかったのでは……?

なんだかもうちょっと簡単に書けるような……。
もっともっときれいにソースコード書けるようになりたいなぁ……。

1
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?