正则表达式匹配img标记与某些属性类

时间:2011-07-11 14:03:23

标签: php javascript regex

我正在努力解决这个正则表达式,但我找不到任何修复方法。我使用基于javascript的工具来测试和编写表达式。当放入php页面并与preg匹配时,结果会有所不同。

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

要测试的例子在这里,第一个不应该匹配。这一切都可以使用javascript,但不能使用php,只会匹配class 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">

2 个答案:

答案 0 :(得分:1)

使用DOM&amp;没有花哨的表达......

<?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 )

答案 1 :(得分:0)

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

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

Regular expression pattern not matching anywhere in string