2012-11-15 94 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) { ... }; 
相关问题