匹配正则表达式中链接内的图像

时间:2013-06-30 06:33:23

标签: php regex

我创建的正则表达式模式有什么问题:

$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>&nbsp;</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>&nbsp;</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>")

2 个答案:

答案 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

PHP代码示例:

示例文字

注意最后一行有一个丑陋的属性,它将阻止大多数其他正则表达式。

<p>&nbsp;</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>

enter image description here

<强>代码

<?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>

根据您的需要,您只需在\<>之前添加一些反斜杠/