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

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

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

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

正規表現

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

Q&A

3回答

701閲覧

正規表現 HTMLのIMGタグ以外のすべてを削除する方法

annchan25

総合スコア6

PHP

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

正規表現

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

0グッド

1クリップ

投稿2018/04/22 20:13

編集2022/01/12 10:55

この度、WordpressのPHPファイルにて、正規表現を使って、<img>タグ以外のタグとテキストを削除したいと思うのですが、どうもうまくいきません。
<img>以外を削除してもタグは消せてもテキストが残ったり、そもそもタグが消えなかったりしてしまいます。

もうお手上げの状態で、何かヒントをいただけないでしょうか。
よろしくお願いします。

発生している問題・エラーメッセージ

正規表現でIMGタグ以外を削除することができない

該当のソースコード

<(?!img)(.|\s)*?> テキストが残る
^(?!.img).$ 消えない

変更前

<div class="title">タイトル</div> <div class="text"> <p><strong>1</strong><label class="name">名前</label></p> <div class="image"><img class="img" src="example.com/a.jpg"/></div> </div>

変更したい形
<img class="img" src="example.com/a.jpg"/>

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

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

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

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

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

m.ts10806

2018/04/22 21:46

どのような文字列に対してどのようになるのが目標 というのをサンプルで提示していただけますか?
annchan25

2018/04/22 22:35

説明が不十分でした。申し訳ございません。追記しました。
annchan25

2018/04/23 13:41

回答いただき、本当にありがとうございます。回答をもとにプラグインを作成したのですが、そこでも躓いてしまいました。同じ質問に追記するのはややこしいので、新たに質問させていただきます。解決したあとにこの質問を解決にしたいと思います。よろしくお願いいたします。
m.ts10806

2018/04/23 21:57 編集

まだ「受付中」となっています。自身で回答を書かれて自己解決とするか、既についている回答にベストアンサーをつけて「解決済み」としてください。前の質問が残ったまま次の質問を同件で立てるのはあまり好ましくありません。もしそうしないのであればこちらの質問に追記して解決まで対応していくべきと思います。
guest

回答3

0

これでどうだろう。

PHP

1$allowed_html = array( 2 'img' => array( 3 'alt' => true, 4 'height' => true, 5 'id' => true, 6 'referrerpolicy' => true, 7 'sizes' => true, 8 'src' => true, 9 'srcset' => true, 10 'style' => true, 11 'width' => true, 12 ) 13); 14echo wp_kses( $text, $allowed_html );

【wp_kses() | Function | WordPress Developer Resources】
https://developer.wordpress.org/reference/functions/wp_kses/

【WordPressでサイト作成する際に最低限必要なこと - Qiita】
https://qiita.com/miosee/items/dbecefb1b9028a52db64#htmlタグを除去-wp_kses関数

【複雑な WordPress のエスケープ関数を整理してみる – ミルログ】
https://www.mirucon.com/2017/07/11/the-complex-wordpress-escaping/

投稿2018/04/23 01:45

kei344

総合スコア69366

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

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

annchan25

2018/04/23 13:09

回答ありがとうございます。このような方法もあるのですね。Wordpressですのでこの方法が使えそうです。今のところ目的を達成することはできていませんが、もう少し調べてみたいと思います。
annchan25

2018/04/28 00:55

希望する動作をするフィルターを見つけ、IMGタグ以外を削除することに成功したのですが、タグ以外のテキストが残っているようです。こちらのテキストも削除することはできないでしょうか?
guest

0

要件と違ったら申し訳ないのですが、
私もブラックリスト方式ではなくホワイトリスト方式の方が良いと思います。
対象が「imgタグのみ」と限定的であればなおさら、「そこだけ取り出す」方が考え方は楽です。
※もちろんそういう課題に取り組んでいるのであれば仕方ないですが、その場合は経緯も明記してください

ということで、私の思うところでザッと考えてみたのですが、
対象がhtml限定であればDOMDocumentが使えると思います。

php

1$dom = new DOMDocument; 2 3$html = <<<EOF 4<div class="title">タイトル</div> 5<div class="text"> 6<p><strong>1</strong><label class="name">名前</label></p> 7<div class="image"><img class="img" src="example.com/a.jpg"/></div> 8</div> 9EOF; 10 11$dom->loadHTML(mb_convert_encoding($html,'HTML-ENTITIES', 'UTF-8')); 12$getimg = $dom->getElementsByTagName('img'); 13foreach($getimg as $img){ 14 echo $dom->saveHTML($img); 15} 16

Wordpressで、とのことなのでもしかしたらもっと簡単にできる仕組みがあるかもしれません。

投稿2018/04/23 00:46

編集2018/04/23 00:52
m.ts10806

総合スコア80765

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

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

annchan25

2018/04/23 02:15

回答ありがとうございます。確かに、削除するより抽出するほうがうまくいきそうですね。 なぜ削除したかったかというと、私の目的を果たせそうな方法を探していたところ、こちら(https://wordpress.stackexchange.com/questions/195856/adding-regex-filter-to-feedwordpress)の質問を見つけ、利用できないかと考えていたためです。 (目的というのは、別サーバーにある複数のサイト(WordPress)からフィードを発信し、メインのWordPressサイトにインストールしたFeedWordPressプラグインで、別サーバーの記事を取得しひとつのサイトにまとめたいというもので、その際テキストなどは除外して画像だけにしたいのです。 わざわざ別サーバーに画像や記事を保存するのは、そのサーバーが容量無制限のためです。)
m.ts10806

2018/04/23 02:18

なるほど、色々とやりたいことがあるのですね。 その部分が質問にあると、よりやりたいこと・目的に向かった解決方法が提示されやすくなります。 今のところWordPressの機能を使っているkei344さんの回答が近そうですね。
annchan25

2018/04/23 13:08

スクレイピング技術というのですね。これについてもかなり調べたのですが、全然思い通りにいかず、最終的にこのような方法に至ったのですが、以降のサイト制作にはスクレイピング技術を学んで取り入れてみたいと思います。
guest

0

正規表現でIMGタグ以外を削除することができない

<img>だけを抽出する」に要件を変えると、シンプルに実装出来そうです。
http://php.net/manual/ja/function.preg-match-all.php

以下、未検証。

php

1'/<img\s[^>]*>/i'

上記正規表現は属性値で > が正しくエスケープされている前提。エスケープされていないなら、属性値を消費する為の正規表現が必要。


どうしても、削除したいとしたら、

  • 「img」と「img以外」を消費して、「img」だけを返す

のように考え方を変える必要があると思います。
<img> は空要素なので、タグの対応関係を考える必要がありません。

Re: annchan25 さん

投稿2018/04/22 23:57

編集2018/04/23 00:08
think49

総合スコア18156

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

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

annchan25

2018/04/23 01:46

回答ありがとうございます。やはり、IMGだけとなると抽出するほうがよさそうですね。抽出する方法でうまくいくよう試していきたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問