0

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

$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] => 数组 ([0] => "

<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>")
4

2 回答 2

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>

在此处输入图像描述

代码

<?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>
于 2013-06-30T16:05:20.013 回答
-1

也许问题的.+\>部分原因是它匹配到最后的所有内容>

尝试使用与停止相同的方法"[^\>]+ 这在我的编辑器中有效

<a.+><img[^>]+></a>

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

于 2013-06-30T06:40:53.677 回答