0

段落内または段落の最後にのみ img タグがあるかどうかを確認するにはどうすればよいですか?

$input = '<p><img src="#" /></p>'; // ok
$input = '<p><img src="#" /><img src="#" /></p>'; // ok
$input = '<p>xxx<img src="#" /></p>'; // ok

$input = '<p><img src="#" />xxx</p>'; // NOT ok

if(preg_match("/img/$", $input) { ... };

preg_matchand以外のより良い方法はありregexますか?

4

3 に答える 3

3

を使用して、ノードDOMDocumentにテキスト コンテンツがあるかどうかを確認できます。<p>

$doc = new DOMDocument;
$doc->loadHTML( $input);

$p = $doc->getElementsByTagName('p')->item(0);
$children = $p->childNodes;

$img_found = false; $error = false;

foreach( $children as $child) {
    if( $child->nodeType == XML_TEXT_NODE && !$img_found) {
        // Text before the image, OK, continue on
        continue;
    }
    if( $child->nodeType == XML_ELEMENT_NODE) {
        // DOMElement node
        if( !($child->tagName == 'img')) {
            // echo "Invalid HTML element found";
            $error = true;
        } else {
            $img_found = true;
        }
    } else {
        // echo "Invalid node type!";
        $error = true;
    }
}

// No errors and we found at least one image, we're good
if( $img_found && !$error) {
    echo 'ok' . "\n";
} else {
    echo 'NOT ok' . "\n";
}

このデモでは、すべてのテストに合格していることがわかります。次の要件を満たしています。

  1. <p>タグ内の画像とテキストのみ。その他のタグは無効です。これが正しくない場合は、必要に応じて変更してください。
  2. テキストがある場合、<img>タグを検出する前にテキストが来る必要があります。
于 2012-11-15T14:31:23.223 に答える
1

次の正規表現を試してください。

/<p[^>]*>.*<img[^>]*></p>/

説明: 不明な属性を持つタグを正規表現と一致させたい場合は、 を使用できます<TAGNAME[^>]*>。この式は、[^>]*以外のすべての文字に 0 回または n 回一致する>ため、任意の数の属性を受け入れることができます。

于 2012-11-15T14:31:54.050 に答える
1

これを使用してください:

if (preg_match("/<img\s[^<>]*><\/p>/i", $input) { ... };
于 2012-11-15T15:14:19.320 に答える