質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

2回答

1254閲覧

PHPでスペースや改行だけしか含んでいないHTMLタグを削除

ogaden

総合スコア12

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2018/12/26 05:12

編集2018/12/26 09:55

以下の事前処理済みのHTMLの中から内容が無いと判断する<p>タグを削除したいと思っています。
<p>タグ、<br>タグ以外は**strip_tags()**にて削除。

preg_replace()にて、以下の正規表現を考えてみたものの、想定の挙動になりませんでした。
一つの<p>タグないで完結したいのですが、他の<p>タグに跨って削除されてしまうものを解消できないでしょうか。

PHP

1preg_replace( "/<(p|p\s.*)>(\r|\n|\r\n|\s| |<br>|<br />)*</p>/mis", "", $html);

html

1<!-- 挙動が異常なケース --> 2A文章がいくつかあります<br> 3<p class="xxx"></p> 4B文章がいくつかあります<br> 5C文章がいくつかあります<br> 6<p></p> 7<p id="xxxx"><br></p> 8D文章がいくつかあります<br> 9 10<!-- 上記の実行結果 --> 11A文章がいくつかあります<br> 12D文章がいくつかあります<br> 13 14<!-- 求めていた結果 --> 15A文章がいくつかあります<br> 16 17B文章がいくつかあります<br> 18C文章がいくつかあります<br> 19 20 21D文章がいくつかあります<br> 22

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/12/26 05:21 編集

> preg_replace()やpreg_match()を使う予定です。 であればまずご自身でできるところまでやってみてください。質問ではなく単なる作業依頼になっています。
yambejp

2018/12/26 05:31

<p><a></a></p>のように空要素のタグを更にタグがかこう場合はどうするのでしょうか? <p><br></p>をけすなら<p><img></p>なども消すのでしょうか? 条件をきっちり決めて下さい
ogaden

2018/12/26 05:49

大変失礼しました。おっしゃる通りと思います。 私の方で失敗に終わっている構文があるとかえってご苦労を掛けてしまうかと思い、今回のような質問にさせてもらっていました。 前提条件を含め改めて編集させていただきます。 ご指摘感謝いたします。ありがとうございます。
m.ts10806

2018/12/26 05:54

むしろ失敗で終わっているものが回答のヒントになりますし、 もし間違っているやり方であれば方向性を指摘することも出来ます。 つまり、現在は回答するための材料が一切削られてしまっている状態です。 1つ前の質問で色々試されていたと思いますが、あのような「試したこと」が回答者が実は最も欲しがる要素の1つです(本当に最も欲しいのは具体的な要件ですが)
m.ts10806

2018/12/26 06:10

直接の回答ではないのでこちらに書きますが、HTMLを正規表現で扱うのってかなり難しくてどこか必ず抜けが出るものと思います。 HTMLの構文解析ができるライブラリを利用して(スクレイピングの要領)、チェックされたほうが分かりやすいように思います。 https://liginc.co.jp/358628
ogaden

2018/12/26 10:06

ご教授ありがとうございます。その通りですよね。 当然のことでしたが、自分で整理できていないことを依頼するのは浅はかでした。 当時頭がごちゃごちゃして行き詰っていましたが、ご指摘を受けて内容を整理しているうちに突破口を見つけることができました。 ご指摘の通り見つけた突破口も想定外のケースで穴が生まれる可能性があることを認識して実装したいと思います。今回は特殊な仕様や古い動作環境であるためライブラリ検討をしておりませんでしたが、いただいた情報を別途拝見したいと思います。 ご協力ありがとうございました。
guest

回答2

0

ベストアンサー

HTMLは必ずしも正しい文法とも限らないのでPHPをベースにするなら
一度dom評価をした方がよいような気がします

DOMDocumentで処理を検討なさったほうがよいのではないでしょうか?

投稿2018/12/26 12:26

yambejp

総合スコア114843

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ogaden

2018/12/27 01:05

なるほど、このクラスの存在を知らずにことを進めていました。 たしかに想定外の文法に備える必要がありますね。 仕様を理解して利用を検討したいと思います。 ご助言ありがとうございます。
guest

0

状況を整理するうちに問題の個所が見えてきました。
以下のコードにて解決できました。

PHP

1// 解決したコード 2preg_replace( "/<(p|p\s[^>]*)>(\r|\n|\r\n|\s| |<br>|<br />)*</p>/mis", "", $html); 3 4// 不備のあったコード 5preg_replace( "/<(p|p\s.*)>(\r|\n|\r\n|\s| |<br>|<br />)*</p>/mis", "", $html);

pタグ内の属性記述に対応するために設けた繰り返し指示(p\s.*)で、pタグを超えて適用されるケースがあったので、「>」以外の文字を繰り返すに変更して解決に至りました。

上記で解消されることを確認しましたが、まだ不備が残るようなご指摘があればお願いします。
ご指摘なければ明日解決とさせていただきます。

投稿2018/12/26 10:00

ogaden

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/12/26 10:11

今のところ「それでいけるならいいんじゃないかな」くらいしか思いませんが、実際に利用するhtmlにあてはめられたほうが良いかと。パターンテストですね。 php的に特別な意味をもつ記号が入ってきた場合とか。 レアケースを追ってもキリはないですけどね。コメントでも書いたように正規表現でhtml解析はかなり無理が出てきます。安全に行うには相当の知識と技術を要します。やはりライブラリ利用で構文解析が妥当かなと思います。
ogaden

2018/12/26 10:24

承知しました。 パターンテストを別途行いつつも、実運用で不備がでないかもしばらく見ていこうと思います。 最後までご教授ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問