匹配3个或更多标签组内的图像标签

时间:2014-07-21 07:34:22

标签: php regex preg-match preg-match-all

我正在尝试获取图像标签,这些标签出现在一堆最少3个,如下面

$str = "

<img>Some image</img>

Text Text Text Text Text Text Text 

Text Text Text Text Text Text Text 

Text Text Text Text Text Text Text 
<img>Some image</img>


Text Text Text Text Text Text Text 

Text Text Text Text Text Text Text 

Text Text Text Text Text Text Text 

Text Text Text Text Text Text Text 

<img>Image i need</img>
<img>Image i need</img>
<img>Image i need</img>
<img>Image i need</img>

Text Text Text Text Text Text Text 

Text Text Text Text Text Text Text 

Text Text Text Text Text Text Text

";

我尝试了以下

preg_match_all("/<img/is", $str, $matches);

但是这只是返回所有的图像标签,我试图将一些文本与多次出现的图像匹配,但仍然可以让它工作......任何帮助都是值得赞赏的人。

感谢答案的人,特别是zx81和avinash,但我也想知道这种类型的图像标签的相同正则表达式

<img src='data' />
<img src='data' />
<img src='data' />
<img src='data' />

再次感谢你们

4 个答案:

答案 0 :(得分:0)

您需要使用括号()捕捉匹配的某些部分。这是一个带有一个捕获组的示例正则表达式:

preg_match_all("/<img>(.+?)</img>/", $str, $matches);

如果你现在看$matches,你会看到<img>标签之间的文字存储在数组的seprare条目中。

答案 1 :(得分:0)

这可能就是你需要的

(<img>.+?<\/img>\s*){3,}

这将捕获所有img标记,并且仅当它们至少连续3个时才会捕获。这可以使用regex101进行测试。哦,并使用全球旗帜

答案 2 :(得分:0)

我认为这就是你想要的,

/(?:<img\b[^\n]*\n){3,}/gm

匹配三个或更多连续图像标记。

DEMO

您的PHP代码将是,

$regex =  '~(?:<img\b[^\n]*\n){3,}~';
preg_match_all($regex, $str, $matches);
echo var_dump($matches);

输出:

<img>Image i need</img>
<img>Image i need</img>
<img>Image i need</img>
<img>Image i need</img>

如果您希望将它们放在单独的组索引中,请尝试以下

(?<!<\/img>\n)<img\b[^\n]*\n<img\b[^\n]*\n(?!<img)|(?<!<\/img>\n)<img\b[^\n]*\n(?!<img)(*SKIP)(*F)|(<img>Image i need<\/img>)

DEMO

答案 3 :(得分:0)

标签数组:一点DEFINE工作

在正则表达式中逐个匹配图像标签是一项任务,但可以完成:

(?smx)   # free-spacing, DOTALL, multi-line

# Let's define an image tag
(?(DEFINE)(?<image><img[^>]*>[^<]*</img>))

(?:
  # If what follows is 3 images
  (?=(?&image)(?:\s*^(?&image)){2})
  # OR
  |
  # We're at a continuation point, but not the beginning of the string
  (?:(?<!\A)\G)      
  # Match and drop whitespaces
  \s*\K
)
# THEN Match an image!
(?&image)

the regex demo中,您可以看到正确的标签是逐个匹配的。

示例PHP代码打印所有匹配项:

$regex = '~(?smx)(?(DEFINE)(?<image><img[^>]*>[^<]*</img>))
(?:
  (?=(?&image)(?:\s*^(?&image)){2})
  |
  (?:(?<!\A)\G)\s*\K
)
(?&image)~';

if (preg_match_all($regex, $yourstring, $matches)) {
   print_r($matches[0]);
}

扩展规格

对于标签特定于<img src='data' />开始的相同模式,请使用以下代码:

$regex = '~(?smx)(?(DEFINE)(?<image><img[ ]src='data'[ ]/>[^<]*</img>))
(?:
  (?=(?&image)(?:\s*^(?&image)){2})
  |
  (?:(?<!\A)\G)\s*\K
)
(?&image)~';

if (preg_match_all($regex, $yourstring, $matches)) {
   print_r($matches[0]);
}