我正在尝试获取图像标签,这些标签出现在一堆最少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' />
再次感谢你们
答案 0 :(得分:0)
您需要使用括号(
和)
捕捉匹配的某些部分。这是一个带有一个捕获组的示例正则表达式:
preg_match_all("/<img>(.+?)</img>/", $str, $matches);
如果你现在看$matches
,你会看到<img>
标签之间的文字存储在数组的seprare条目中。
答案 1 :(得分:0)
答案 2 :(得分:0)
我认为这就是你想要的,
/(?:<img\b[^\n]*\n){3,}/gm
匹配三个或更多连续图像标记。
您的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>)
答案 3 :(得分:0)
在正则表达式中逐个匹配图像标签是一项任务,但可以完成:
(?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]);
}