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

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

ただいまの
回答率

90.46%

  • PHP

    20851questions

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

正規表現で いくつかの文字列以外 にマッチさせるためには?

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,094

imamura

score 123

閉じタグが必要なのに閉じタグが無いものを探そうとしています。
※loadHTMLを利用しているので<iframe></iframe>などは必ず <iframe /> という空要素になります。
http://php.net/manual/ja/domdocument.loadhtml.php

<iframe>などは次に続く要素を取り込んで(?)しまい、正しく表示されなくなります。
そこで非空要素タグで <xxxx />となっているものを正規表現で見つけようとしています。

空要素の空要素タグは下記の方法で見つけることができました。
preg_match_all("/<(area|base|colgroup|col|command|embed|hr|img|input|keygen|link|menuitem|meta|pram|source|track|wbr)[^>]*\/>/s",$str,$matches);

しかし、目的となる「非空要素で空要素となっているタグ」を見つける方法がわかりません。下記のような正規表現を作りましたがヒットしませんでした。
preg_match_all("/<[^(area|base|colgroup|col|command|embed|hr|img|input|keygen|link|menuitem|meta|pram|source|track|wbr)][^>]*\/>/s",$str,$matches);
発見後は、閉じタグを追加するように書き換える予定です。

よろしくお願いします。
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

<[^(base)]* />この記述は「b」も「a」も「s」も「e」も含まないタグといった解釈をされそうに思います。
候補に「img」や「link」があるのでiframeも除外されているものと思います。
否定は面倒なので、非空要素のリストを作成したほうが簡単かもしれません。

ライブラリ次第で動作したりしなかったりするかも知れませんが、否定を使うなら次のような感じでいけるかも知れません。
<(?!base|hr)[^>]*?\/>
※phpのライブラリは否定の先読みって動作しましたっけ?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/07/24 12:55

    ありがとうございます。phpは 否定先読み が可能でした。
    http://php.net/manual/ja/regexp.reference.assertions.php
    正規表現は奥深いですね。

    キャンセル

0

hirohiro様が殆ど答えを出していますが・・・
$r = array();
preg_match_all("/<(?!area|base|colgroup|col|command|embed|hr|img|input|keygen|link|menuitem|meta|pram|source|track|wbr)[^>]*\/>/s",$str,$matches,PREG_SET_ORDER);
foreach($matches as $v) {
    $r[] = $v[0];
}
これで$rに非空要素で空要素となっているタグが入ってくる…はずです。一応動作検証済ですが(汗

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/07/24 12:58

    コードありがとうございます。このまま動作させることができました。
    PREG_SET_ORDER という引数があったんですね。これ便利です。

    キャンセル

関連した質問

同じタグがついた質問を見る

  • PHP

    20851questions

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