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

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

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

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

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

正規表現

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

3回答

2101閲覧

preg_replace で 特定のクラス名のついたのHTMLタグ一式を取り除く

momo_monom

総合スコア22

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

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

正規表現

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2021/11/19 07:26

preg_replaceを勉強中です。
特定のクラス名がついたHTMLタグ一式を取り除きたく、
以下のコードで、一応実現できています。

PHP

1$content = '<img class="a" src="figure.jpg" />'; 2$pattern = '/<img class="a"(.*?)/>/'; 3$replace = ''; 4$content = preg_replace( $pattern, $replace, $content ); 5echo $content;

しかし、置き換え元の文字列内に
以下のようにクラス名の記述の場所が違うものもあります。

PHP

1$content = '<img src="figure.jpg" class="a" />';

クラス名がどの場所に記述されている場合でも
一括で取り除くようなことは可能なのでしょうか?

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

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

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

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

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

yambejp

2021/11/19 09:22 編集

クラスは複数ついている場合もありますが想定が必要ですか? DOMDocumentで処理したほうがいいと思いますが・・・ imgタグだけで大丈夫ですか?
momo_monom

2021/11/19 09:23

ありがとうございます。 たしかに。。class="a b" や class="b a" や class="c a b" のような場合にも対応したいです。 DOMDocument ですね。。全く知識がなく、こちらも勉強をはじめてみます。
guest

回答3

0

PHP

1$html=<<<eof 2test 3<img src="figure0.jpg" /> 4<img class="a" src="figure1.jpg" /> 5<img class="a c" src="figure2.jpg" /> 6<img class="aa" src="figure3.jpg" /> 7<img src="figure4.jpg" class="a" /> 8<img src="figure5.jpg" class= 'a' /> 9<img src="figure6.jpg" class= 'b a c' /> 10test 11eof; 12print htmlspecialchars($html); 13print "<hr>"; 14$doc = new DOMDocument(); 15$doc->loadHTML("<body>$html</body>"); 16$nodes=$doc->getElementsByTagName('img'); 17for($i=$nodes->length-1;$i>=0;$i--){ 18 $node=$nodes->item($i); 19 $class=$node->getAttribute("class"); 20 if(preg_match("/(^| )a( |$)/",$class)){ 21 $node->parentNode->removeChild($node); 22 } 23} 24$html=preg_replace("/\A<body>|</body>\z/","",$doc->saveHTML($doc->getElementsByTagName("body")[0])); 25print htmlspecialchars($html);

投稿2021/11/19 10:33

yambejp

総合スコア115012

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

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

momo_monom

2021/11/20 08:47

ありがとうございます!DOMDocument ですね。 クラス名 a が含まれるタグがすべて消えました。 勉強します!
guest

0

ベストアンサー

php

1<?php 2$content = <<<EOT 3<img class="a" src="figure.jpg" /> 4<img src="figure.jpg" class="a" /> 5 6<img class="b" src="figure.jpg" /> 7<img src="figure.jpg" class="b" /> 8 9<img class="a b" src="figure.jpg" /> 10<img src="figure.jpg" class="b c" /> 11EOT; 12 13$pattern = '/<img[^/]*?class="[^"]*a[^"]*"[^/]*?/?>/'; 14echo preg_replace($pattern, 'REPLACED', $content);

別解 (長い正規表現を使わない)

php

1<?php 2$content = <<<EOT 3<img class="a" src="figure.jpg" /> 4<img src="figure.jpg" class="a" /> 5 6<img class="b" src="figure.jpg" /> 7<img src="figure.jpg" class="b" /> 8 9<img class="a b" src="figure.jpg" /> 10<img src="figure.jpg" class="b c" /> 11EOT; 12 13// すべての <img> 要素を取得する 14preg_match_all('/<img.+?/?>/', $content, $matches, PREG_PATTERN_ORDER); 15 16$subjects = []; 17foreach($matches[0] as $match) { 18 $prefix_removed = explode('class="', $match)[1]; // 'a" src="figure.jpg" />' だけ残る 19 $suffix_removed = explode('"', $prefix_removed)[0]; // 'a' だけ残る 20 $classes = preg_split('/\s/', $suffix_removed); // ['a', 'b'] 21 22 // 'a'クラスが含まれていない場合は弾く 23 if(!in_array('a', $classes, true)) continue; 24 25 $subjects[] = $match; 26} 27echo str_replace($subjects, 'REPLACED', $content);

投稿2021/11/19 10:05

thyda.eiqau

総合スコア2982

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

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

momo_monom

2021/11/20 08:52

ありがとうございます! クラス名 a が含まれるタグがすべて消えました。
momo_monom

2021/11/20 13:32

<img class="a" src="/figure.jpg" /> すみません。。。上記のように文字列にスラッシュが含まれると、うまく置き換わりませんでした。文字列内のスラッシュへもなにか対処が必要なのでしょうか?
momo_monom

2021/11/20 13:47 編集

<img class="a" src="/figure.jpg" /> の場合も、別解(長い正規表現を使わない)の方は、問題なく置き換わりました!
thyda.eiqau

2021/11/21 12:35

正規化できない文字列を正規表現で片付けようとするのはやめましょう。HTMLを解釈したいのであればDOMDocumentを使うのが正道です
momo_monom

2021/11/22 04:18

ありがとうございます。やはり DOMDocument ですね。勉強します!
guest

0

他のプロパティがあるかないかを*識別子(0回以上の繰り返し)で判別すれば大丈夫かと思います。
これで値が何があろうが、同じクラス名を持ったimgタグだけ抽出できるかと。

aを含むクラス名の場合はどこかにaを含むようにして、間に空間(\s)を開けておきます。何マス分あけてるかわからないので、念の為*演算子にしてます。

php

1$pattern = '<img\s+(.+\s*)?class="((.+\s)*a(\s.+)*)"(.+\s*)?/>';

念の為、どこが消去されるかエディタで試されてみた方がいいです。

投稿2021/11/19 09:25

編集2021/11/19 23:18
FKM

総合スコア3644

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

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

thyda.eiqau

2021/11/19 10:00

(.+\s*)? の前後のスペースは消しておかないと、<img class="a" />にヒットしない (<imgとclassの間にスペースが2つ必要) です
FKM

2021/11/19 10:04

ありがとうございます。チェッカーサイトで検証した後コピペしたときに、勝手に空白が空いたようです。
thyda.eiqau

2021/11/19 10:05

なんか全角スペースが入っております '<img ←
momo_monom

2021/11/20 08:53

ありがとうございます! 前後に / をつけると、クラス名 a が含まれるタグがすべて消えました。 $pattern = '/<img\s+(.+\s*)?class="((.+\s)*a(\s.+)*)"(.+\s*)?/>/';
momo_monom

2021/11/20 13:38

<img class="b" src="figure.jpg" /><img class="a" src="figure.jpg" /> すみません。。上記のように直前に<img>タグがあると、直前のタグも一緒に削除されてしまうようでした。。。どの記述が影響しているのでしょうか?
FKM

2021/11/22 00:01

'^<img\s+(.+\s*)?class="((.+\s)*a(\s.+)*)"(.+\s*)?/>$'; 接頭辞と接尾辞をつけたらいいでしょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問