PHP正则表达式检查图像是否用标记包装

PHP正则表达式检查图像是否用标记包装,php,regex,html-parsing,Php,Regex,Html Parsing,我正在创建一个wordpress函数,需要确定内容中的图像是否用包含PDF或文档文件链接的标签包装,例如 <a href="www.site.com/document.pdf"><img src="../images/image.jpg" /></a> 我将如何使用PHP实现这一点 谢谢我强烈建议不要为此使用正则表达式。除了更容易出错和可读性较差之外,它还不能让您轻松地操作内容 最好将内容加载到DomDocument中,检索所有 这是一些文字更多的文字

我正在创建一个wordpress函数,需要确定内容中的图像是否用包含PDF或文档文件链接的标签包装,例如

<a href="www.site.com/document.pdf"><img src="../images/image.jpg" /></a>

我将如何使用PHP实现这一点

谢谢

我强烈建议不要为此使用正则表达式。除了更容易出错和可读性较差之外,它还不能让您轻松地操作内容

最好将内容加载到DomDocument中,检索所有

这是一些文字更多的文字

HTML; $oDoc=新的DOMDocument(); $oDoc->loadHTML($sHtml); $oNodeList=$oDoc->getElementsByTagName('img'); foreach($oNodeList作为$t_oNode) { 如果($t_oNode->parentNode->nodeName=='a') { $sLinkValue=$t_oNode->parentNode->getAttribute('href'); $sExtension=substr($sLinkValue,strrpos($sLinkValue,'.'); 回声“
  • 我被包裹在锚定标签中” '我链接到一个'$sExtension.'文件' ; } } ?>

  • 我将为读者留下一个确切的实现作为练习;-)

    以下是一个基于DOM解析的代码,您可以使用:

    <?php
    
    $sHtml = <<<HTML
    <html>
    <body>
        <img src="../images/image.jpg" />
        <a href="www.site.com/document.pdf"><img src="../images/image.jpg" /></a>
        <a href="www.site.com/document.txt"><img src="../images/image.jpg" /></a>
        <p>this is some text <a href="site.com/doc.pdf"> more text</p> 
    </body>
    </html>
    HTML;
    
    $oDoc = new DOMDocument();
    $oDoc->loadHTML($sHtml);
    $oNodeList = $oDoc->getElementsByTagName('img');
    
    foreach($oNodeList as $t_oNode)
    {
        if($t_oNode->parentNode->nodeName === 'a')
        {
            $sLinkValue = $t_oNode->parentNode->getAttribute('href');
            $sExtension = substr($sLinkValue, strrpos($sLinkValue, '.'));
    
            echo '<li>I am wrapped in an anchor tag '
               . 'and I link to  a ' . $sExtension . ' file '
            ; 
        }
    }
    ?>
    
    $html=getElementsByTagName('a');
    对于($i=0;$i<$nodeList->length;$i++){
    $node=$nodeList->item($i);
    $children=$node->childNodes;
    $hasImage=false;
    foreach($childrenas$child){
    如果($child->nodeName=='img'){
    $hasImage=true;
    打破
    }
    }
    如果(!$hasImage)
    继续;
    如果($node->hasAttributes())
    foreach($node->attributes as$attr){
    $name=$attr->nodeName;
    $value=$attr->nodeValue;
    如果($attr->nodeName=='href'&&
    预匹配('/\.(doc | pdf)$/i',$attr->nodeValue)){
    echo$attr->nodeValue。
    “-图像被包装在指向PDF或DOC文件的链接中\n”;
    打破
    }
    }
    }
    

    现场演示:看一看,选择你最喜欢的方法,然后分析文本中的所有链接。正则表达式通常是解析问题的错误解决方案。和标记并不总是完全如图所示,因为要处理动态内容,所以会有变化。例如,可能有一个字符串,例如:这是一些文本更多文本

    不要使用正则表达式来解析HTML。您无法用正则表达式可靠地解析HTML,在这条路上您将面临悲伤和挫折。一旦HTML改变了您的预期,您的代码就会被破坏。有关如何使用已经编写、测试和调试过的PHP模块正确解析HTML的示例,请参见。+1,您还可以将
    和&preg\u match('/\.(pdf | doc)$/i',$t\u oNode->parentNode->getAttribute(href'))
    添加到
    if
    语句中。我觉得更倾向于使用
    strrpos
    :-)
    $html = <<< EOF
    <a href="www.site.com/document.pdf"><img src="../images/image.jpg" /></a>
    <img src="../images/image1.jpg" />
    <a href="www.site.com/document.txt"><IMG src="../images/image2.jpg" /></a>
    <a href="www.site.com/document.doc"><img src="../images/image3.jpg" /></a>
    <a href="www.site.com/document1.pdf">My PDF</a>
    EOF;
    $doc = new DOMDocument();
    libxml_use_internal_errors(true);
    $doc->loadHTML($html); // loads your html
    $nodeList = $doc->getElementsByTagName('a');
    for($i=0; $i < $nodeList->length; $i++) {
        $node = $nodeList->item($i);
        $children = $node->childNodes; 
        $hasImage = false;
        foreach ($children as $child) { 
           if ($child->nodeName == 'img') {
              $hasImage = true;
              break;
           }
        }
        if (!$hasImage)
           continue;
        if ($node->hasAttributes())
           foreach ($node->attributes as $attr) {
              $name = $attr->nodeName;
              $value = $attr->nodeValue;
              if ($attr->nodeName == 'href' && 
                  preg_match('/\.(doc|pdf)$/i', $attr->nodeValue)) {
                    echo $attr->nodeValue . 
                         " - Image is wrapped in a link to a PDF or DOC file\n";
                    break;
              }
    
           }
    }