繁体   English   中英

正则表达式匹配具有特定属性 class 的 img 标签

[英]Regex match img tag with certain attribute class

我一直在为这个正则表达式苦苦挣扎,但我找不到任何解决方法。 我使用基于 javascript 的工具来测试和编写表达式。 当放入 php 页面并与 preg 匹配时,结果是不同的。

/(<img\b src=)"([^"]+)"(.* class=".*colorme(?:.|[^"]*)"[^>]+>)/

而且要测试的例子都在这里,第一个不应该匹配。 这一切都适用于 javascript,但不适用于 php,只有类 class="colorme" 将被匹配。 我错过了什么吗?

<img src="http://test.jpg" class="then" border="0" width="123" height="83">

<img src="test.jpg" border="0" alt="well watch picture" alt="tersts" class="really colorme" width="228" height="138">

<img src="test.jpeg" class="colorme then" border="0" width="123" height="83">

<img src="test" border="0" width="123" height="83" class="pic colorme then" with="me">

<img src="tests" border="0" class="colorme" width="123" height="83">

使用 DOM,没有花哨的表达方式...

<?php 
$doc =<<<DEMO
<img src="http://test.jpg" class="then" border="0" width="123" height="83">
<img src="test.jpg" border="0" alt="well watch picture" alt="tersts" class="really colorme" width="228" height="138">
<img src="test.jpeg" class="colorme then" border="0" width="123" height="83">
<img src="test" border="0" width="123" height="83" class="pic colorme then" with="me">
<img src="tests" border="0" class="colorme" width="123" height="83">
DEMO;

$xml = new DOMDocument();
//Or you could use for locally saved files
//@$xml->loadHTMLFile('savedfile.html');
@$xml->loadHTML($doc);
foreach($xml->getElementsByTagName('img') as $image) {
    if(strstr($image->getAttribute('class'),'colorme')==true){
        $images[] = $image->getAttribute('src');
    }
}
print_r($images);
?>

输出:

Array (
    [0] => test.jpg
    [1] => test.jpeg
    [2] => test
    [3] => tests )

通常,没有两种正则表达式语言是相同的,并且 Javascript 和 PHP 处理它们的方式之间存在巨大差异,因此您无法真正将其中一种复制并粘贴到另一种中。 老实说,我认为将 DOM 文档 object 与 XPath 之类的东西一起使用会容易得多,但出于您的目的,正则表达式绝对没问题。 如果你试图只匹配一个标签左右,你总是可以制作一个有效的正则表达式,只有当你开始尝试做更多的事情时,你才会开始看到正则表达式在该领域的缺点,大多数人似乎忘记了这一点。

因此,总而言之,您应该使用 HTML 解析器,但您可以使用正则表达式。 两种方式都没有法律。 我建议您为此使用 DOM 和 XPath ,但是如果您想将其作为正则表达式,请查看此页面上的第二个答案(得分为 300+)

正则表达式模式与字符串中的任何位置都不匹配

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM