我创建的正则表达式模式有什么问题:
$link_image_pattern = '/\<a\shref="([^"]*)"\>\<img\s.+\><\/a\>/';
preg_match_all($link_image_pattern, $str, $link_images);
我要做的是匹配其中包含图像的所有链接。
但是当我尝试输出$link_images
时,它包含第一个索引中的所有内容:
<pre>
<?php print_r($link_images); ?>
</pre>
标记看起来像这样:
阵 ( [0] =&gt;排列 ([0] =&gt;“
<p> </p>
<p><strong><a href="url">Title</a></strong></p>
<p>Desc</p>
<p><a href="{$image_url2}"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;" title="image" border="0" alt="image" src="{$image_url2}" width="569" height="409"></a></p>
但是在输出匹配的内容时,它只返回匹配模式的第一个字符串以及页面中的所有其他标记,如下所示:
<a href="{$image_url}"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;" title="image" border="0" alt="image" src="{$image_url}" width="568" height="347"></a></p>
<p> </p>
<p><strong><a href="url">Title</a></strong></p>
<p>Desc</p>
<p><a href="{$image_url2}"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;" title="image" border="0" alt="image" src="{$image_url2}" width="569" height="409"></a></p>")
答案 0 :(得分:3)
正则表达式可能不是解析HTML的最佳解决方案,但有些情况下,它是唯一的选项,例如您的文本编辑器在搜索和放大器中没有“在此处插入html解析脚本”选项。替换表格。如果您实际使用的是PHP,那么最好使用以下解析脚本:
$Document = new DOMXPath($doc);
foreach ($Document->query('//a//img')) {
# do something with it here
}
这种格式通常会让你无法做到这一点,因为他们无法做到这一点。它将确保您的锚标记包含img标记。同时防止奇数(且非常不可能)的边缘情况,其中属性看起来像图像标记。
<a\b(?=\s|>) # match the open anchor tag
(?:='[^']*'|="[^"]*"|=[^'"][^\s>]*|[^>=])* # match the contents of the tag, skipping over the quoted values
> # match the close of the anchor tag
<img\b(?=\s|>) # match the open img tag
(?:='[^']*'|="[^"]*"|=[^'"][^\s>]*|[^>=])* # match the contents of the img tag, skipping over the quoted value
> # match the close of the img tag
<\/a> # matcn the close anchor tag
示例文字
注意最后一行有一个丑陋的属性,它将阻止大多数其他正则表达式。
<p> </p>
<p><strong><a href="url">Title</a></strong></p>
<p>Desc</p>
<p><a href="{$image_url2}"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;" title="image" border="0" alt="image" src="{$image_url2}" width="569" height="409"></a></p>
<p><a href="{$image_url2}" Onmouseover="function(' ><img src=picture.png></a> ');" >I do not have an image</a></p>
<强>代码强>
<?php
$sourcestring="your source string";
preg_match_all('/<a\b(?=\s|>)
(?:=\'[^\']*\'|="[^"]*"|=[^\'"][^\s>]*|[^>=])*
>
<img\b(?=\s|>)
(?:=\'[^\']*\'|="[^"]*"|=[^\'"][^\s>]*|[^>=])*
>
<\/a>/imsx',$sourcestring,$matches);
echo "<pre>".print_r($matches,true);
?>
<强>匹配强>
[0] => <a href="{$image_url2}"><img style="background-image:none;padding-left:0;padding-right:0;display:inline;padding-top:0;border-width:0;" title="image" border="0" alt="image" src="{$image_url2}" width="569" height="409"></a>
答案 1 :(得分:-1)
问题可能在.+\>
部分,因为它匹配到最后>
尝试使用与"
上的停止相同的方法:
[^\>]+
这可以在我的编辑器中使用
<a.+><img[^>]+></a>
根据您的需要,您只需在\
,<
和>
之前添加一些反斜杠/