我一直试图使用preg_match_all
30分钟,但看起来我做不到。
基本上我有$var
,其中包含一串HTML代码。例如:
<br>iihfuhuf
<img title="Image: http://www.jlnv2.local/temp/temp513caca536fcd.jpeg"
src="http://www.jlnv2.local/temp/temp513caca536fcd.jpeg">
<img src="http://www.jlnv2.local/temp/temp513caca73b8da.jpeg"><br>
我想在src
值中获取包含img
的{{1}}个标记的/temp/temp[a-z0-9]{13}\.jpeg
属性值。
这是我到目前为止所做的:
src
答案 0 :(得分:7)
<img[^>]*src="([^"]*/temp/temp[a-z0-9]{13}\.jpeg)"
<img[^>]*
选择IMG标记
src="([^"]*)"
获取src值并将其另存为匹配
/temp/temp[a-z0-9]{13}\.jpeg
是src值的过滤器
对于快速RegEx测试,请使用一些在线工具,例如http://regexpal.com/
答案 1 :(得分:1)
您需要做的就是在正则表达式中添加另一个组。你有想要从大括号匹配中提取的所有内容:
preg_match_all('!(<img.*src="(.*/temp/temp[a-z0-9]{13}\.jpeg)"(.*alt=".*")?>)!', $content, $matches);
你可以看到工作here。您可以在$matches[2]
中找到这些网址。
但只是因为说过:正则表达式不是从HTML中提取任何东西的合理方法。你最好使用DOMDocument,XPath或其他东西。
答案 2 :(得分:0)
试试这个:
preg_match_all('/src="([^"]+temp[a-z0-9]{13}\.jpeg)"/',$url,$matches);
var_dump($matches);
答案 3 :(得分:0)
<?php
$text = '<br>iihfuhuf<img title="Image: http://www.jlnv2.local/temp/temp513caca536fcd.jpeg" src="http://www.jlnv2.local/temp/temp513caca536fcd.jpeg"><img src="http://www.jlnv2.local/temp/temp513caca73b8da.jpeg"><br>';
$pattern = '#src="([^"]+/temp/temp[a-z0-9]{13}\.jpeg)"#';
preg_match_all($pattern, $text, $out);
echo '<pre>';
print_r($out);
?>
Array
(
[0] => Array
(
[0] => src="http://www.jlnv2.local/temp/temp513caca536fcd.jpeg"
[1] => src="http://www.jlnv2.local/temp/temp513caca73b8da.jpeg"
)
[1] => Array
(
[0] => http://www.jlnv2.local/temp/temp513caca536fcd.jpeg
[1] => http://www.jlnv2.local/temp/temp513caca73b8da.jpeg
)
)
答案 4 :(得分:0)
以下是基于DOMDocument
/ DOMXPath
的示例。这可以说是唯一正确的方法,因为除非你真的擅长正则表达式,否则很可能总是存在会破坏你逻辑的边缘情况。
$doc = new DOMDocument;
$xpath = new DOMXPath($doc);
$doc->loadHTML($content);
$candidates = $xpath->query("//img[contains(@src, '/temp/temp')]");
$result = array();
foreach ($candidates as $image) {
$src = $image->getAttribute('src');
if (preg_match('/temp[0-9a-z]{13}\.jpeg$/', $src, $matches)) {
$result[] = $src;
}
}
print_r($result);