当前位置: 首页 > 知识库问答 >
问题:

预匹配多个源

禄烨然
2023-03-14

如何精确匹配img标记的多个实例?我读了一些关于preg_match的教程,但从未真正理解。

我以此为基础:

<img src="http://example.com/1.png" alt="Example" />

<img class="Class" src="http://example.com/2.jpg" alt="Example 2" />

我做了一个小的像正则表达式:

<img (src="|class="Class" src=")http://.+\.(?:jpe?g|png)" alt="

在这之后,我就卡住了。我如何继续匹配所有直到两个字符串的末尾?

我在PHP网站上发现了数组部分:

preg_match('@^(?:http://)?([^/]+)@i',
    "http://www.php.net/index.html", $matches);
$host = $matches[1];

使用我的代码,我如何获得图像URL和alt标签?

谢谢

共有2个答案

那安宁
2023-03-14

为什么不是DOM文档?无论图像如何编写,您都可以获得所有属性:

$string = '<img class="Class" src="http://example.com/2.jpg" alt="Example 2" />';

$dom = new DOMDocument;
$dom->loadHTML($string);
$xpath = new DOMXPath($dom);

$query = '//img';
$elements = $xpath->query($query);

$attributes = array();
$i = 0;
foreach($elements as $one){
    foreach($one->attributes as $att){
        $attributes[$i][$att->nodeName] = $att->nodeValue;
    }
    $i++;
}
print_r($attributes);

/*Array
(
    [0] => Array
        (
            [class] => Class
            [src] => http://example.com/2.jpg
            [alt] => Example 2
        )

)*/
蓟和煦
2023-03-14

对于原始问题,使用preg\u match\u all()函数获取所有匹配项。

对于第二个问题(使用我的代码,我如何获得图像URL和alt标记?),基本上你的正则表达式是正确的。然而,我建议获得整个

$html = "<img src='test.jpg' alt='aaaaaaaaaaa!'>  adfa <img src='test2.jpg' alt='aaaaaaaaaaa2'>  ";

$pattern = '/<img\s[^>]*>/';
$count = preg_match_all($pattern, $html, $matches, PREG_SET_ORDER);

echo "Found: " . $count . "\n";
if ($count > 0) {
    foreach ($matches as $match) {
        $img = $match[0];
        echo "img: " . $img . "\n";
        if (preg_match("/src=['\"]([^'\"]*)['\"]/", $img, $val)) {  # UPDATE: use () to catch the content of src
            $src = $val[1];      # UPDATE: get the part in ()
        }
        if (preg_match("/alt=['\"]([^'\"]*)['\"]/", $img, $val)) {   # UPDATE
            $alt = $val[1];      # UPDATE
        }

        echo "src = " . $src . ", alt = " . $alt . "\n";
    }
}

更新

回答你的评论。当然。只需使用一个组来捕获src=之后的部分。我更新了上面的源代码,并用“更新”进行了评论。

 类似资料:
  • 是否可以让Selenium匹配多个类名? 例如: 谢谢

  • 我正在搜索一个正则表达式来匹配文本中的所有C#方法,每个找到的方法(引用为“内容”)的主体应该可以通过组访问。 如果文本中只存在一种方法,则上面的C#Regex只能给出所需的结果。 原文: 正则表达式: 如果source中只包含method1,那么它可以完美地工作,但是使用其他method2时,只有一个匹配项,并且不能再提取单独的方法体对。 如何修改正则表达式以匹配多种方法?

  • 我在一个项目中使用全文搜索。我想搜索多个单词,但我有一个问题。所以我的查询是; 这个查询是包括word1或word2或word3或word4的搜索,但我想搜索包括word1或word2或word3 word4的搜索 那么解决方案是什么呢?

  • 问题内容: 如何使用FLANN优化许多图片的SIFT功能匹配? 我有一个来自Python OpenCV文档的工作示例。但是,这是将一个图像与另一个图像进行比较,而且速度很慢。我需要它来搜索一系列图像(几千个)中匹配的特征,并且我需要它更快。 我目前的想法: 浏览所有图像并保存功能。怎么样? 将相机的图像与上述基础进行比较,然后找到正确的图像。怎么样? 给我结果,匹配图像或其他东西。 http://

  • 我的目标是得到两个匹配: 非常感谢你的帮助。

  • 问题内容: 我正在尝试模拟一些mongo类,以便不需要连接(相当标准的东西),但是以下代码给我带来了问题: 运行这个得到我: org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 参数匹配器的无效使用! 预期0个匹配器,记录1个: 在… GridFileManagerTest.beforeClass(GridFileManag