2012-11-15 131 views
0

如何檢查段落或末尾是否有img標籤?如何檢查是否有段落或末尾有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_matchregex更好的方法嗎?

+2

你做第一個嘗試自己嗎?你提供的正則表達式並不是很接近。 – Rijk

回答

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"; 
} 

可以在this demo看到,是通過所有的測試。它符合要求:

  1. 只有<p>標籤內的圖像和文字。任何其他標籤都是無效的。如果這是不真實的,請根據您的需要進行修改。
  2. 如果有文本,它必須在我們檢測到<img>標記之前出現。
+0

比正則表達式更好,但不幸的是它沒有捕捉到第三個示例(文本後面跟着圖像)。 – jeroen

+0

這並不折扣其他非文本HTML元素(不是我能想到的任何可能存在於ap標籤中的內容:P),也沒有考慮到其他元素都可以,只要他們在p標籤的末尾。 – Maccath

+0

@Jeroen - 我的第一個答案很快,因爲我的測試服務器處於脫機狀態,我用一個鍵盤演示更新了我的答案。 – nickb

1

試試這個正則表達式:

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

說明: 如果你想匹配與正則表達式未知的屬性可以用<TAGNAME[^>]*>標籤。表達式[^>]*除了>之外還匹配每個字符零或n次,因此接受任意數量的屬性。

1

使用這一個:

if (preg_match("/<img\s[^<>]*><\/p>/i", $input) { ... }; 
相關問題