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

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

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

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

Q&A

解決済

2回答

2756閲覧

[php]preg_replaceを使って正規表現でタグから不必要な属性を削除したい。

awazon78

総合スコア32

PHP

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

0グッド

0クリップ

投稿2017/05/09 02:48

以下のテーブルの様に色々な属性が入り混じっているhtmlを整形して、
'rowspan'と'colspan'のみにしたいです。現在のコードは

php

1$text = preg_replace("/<td\s*?.*?(?!=colspan=([0-9]+)\s*?.*?)>/i", "<td>", $text); 2$text = preg_replace("/<td\s*?.*?(?!=rowspan=([0-9]+)\s*?.*?)>/i", "<td>", $text);//

ですが、エラーも特に無いのですが、変換もされません。
ちなみにダブルクオーテーションで数字を囲むパターンも想定しています。

ご教授頂けると嬉しいです。

html

1<table><tr> 2 <td>ほげほげ</td> 3 <td colspan=4 class=xl56 width=164 style='border-right:1.0pt solid black; 4 border-left:none;width:124pt'>ほげほげ</td> 5</tr> 6 <tr> 7 <td rowspan=2 height=55 class=xl59 width=65 style='border-bottom:1.0pt solid black; 8 height:41.25pt;border-top:none;width:49pt'>2008<br> 9 馬場:良リョウ</td> 10 <td>hoge</td> 11 </tr> 12 <tr> 13 <td>hoge</td> 14 <td>hogemoge</td> 15 </tr> 16 </table>

↓整形後

html

1<table><tr> 2 <td>ほげほげ</td> 3 <td colspan=4>ほげほげ</td> 4</tr> 5 <tr> 6 <td rowspan=2>2008<br> 7 馬場:良リョウ</td> 8 <td>hoge</td> 9 </tr> 10 <tr> 11 <td>hoge</td> 12 <td>hogemoge</td> 13 </tr> 14 </table>

※rowspanとcolspanの数とtrやtdの数が合ってないのはご了承下さい。

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

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

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

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

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

guest

回答2

0

書いた正規表現では、「colspanrowspanのどちらかしかない、あるいは両方ない<td>タグを<td>だけにする」という意味となってしまいます。

正直言って、このような複雑な条件での仕分けを単純な正規表現だけでやるには荷が重すぎます。以下のどちらかの作戦がいいと思います。

  1. PHPにもDOMがあるので、HTML全体をDOMに投げ込んで、あとはgetElementsByTagNameremoveAttributeで処理する
  2. preg_replace_callbackを使って、「<td ...>をヒットさせる→内部の属性を処理する」というように、処理を分割する

投稿2017/05/09 02:57

編集2017/05/09 02:57
maisumakun

総合スコア145184

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

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

0

ベストアンサー

こんな感じでしょうかね?

PHP

1$pattern1="/(?<=\<td)\s.+?(?=>)/s"; 2$replacement=function($x){ 3 $pattern2="/colspan=.+?(?=\s|$)/s"; 4 if(preg_match($pattern2,$x[0],$match)){ 5 return " ".$match[0]; 6 }; 7 return ""; 8}; 9$str=preg_replace_callback($pattern1,$replacement,$str); 10 11

投稿2017/05/09 03:50

yambejp

総合スコア114837

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問