PHP正则表达式检查图像是否用标记包装
我正在创建一个wordpress函数,需要确定内容中的图像是否用包含PDF或文档文件链接的标签包装,例如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中,检索所有 这是一些文字更多的文字
<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;
}
}
}