2011-07-11 68 views
2

我正在努力与这个正则表达式很长一段时间,但我找不到任何修复。我使用基于JavaScript的工具来测试和编写表达式。当进入php页面并与preg匹配时,结果是不同的。正则表达式匹配某些属性类的img标签

/(<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"> 
+6

使用正则表达式查找(这样的复杂性)HTML元素:**坏主意**。使用HTML解析器和XPath!即使在JavaScript中,您也可以利用DOM。 –

+0

JavaScript和PHP有不同的正则表达式。 (有许多不同的正则表达式变体)。因此,使用JavaScript工作并不奇怪,它在PHP中不起作用 - 语法(略有不同)。另外,由于HTML不是常规语言,因此不能使用正则表达式来自己处理它。你可以靠近,也许你可以使你想要做的工作足够好,以解决你正在解决的问题有限的用例,但要小心。 –

+0

我可以推荐正则表达式好友:http://www.regexbuddy.com/ - 它可以帮助您识别和测试正确的表达式,以及何时准备好 - 您可以看到所选语言的正确表达式。 – Andron

回答

1

随着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) 
0

一般来说,没有两个正则表达式语言是相同的,也有与JavaScript和PHP如何处理他们的巨大差异,使得你不能真正复制并粘贴到彼此。我诚实地认为使用类似XPath的DOM Document对象会容易得多,但为了您的目的,正则表达式绝对正确。如果你试图只匹配一个标签左右,你总是可以制定一个有效的正则表达式,只有当你开始尝试做的比你开始看到正则表达式在该领域的缺点,而大多数人似乎忘记了。

所以,总而言之,你应该使用一个HTML解析器,但你可以使用正则表达式。没有任何法律。我会建议你使用DOM和XPath这一点,但如果你想做到这一点作为一个正则表达式,看一下第二个答案(一,得分300+)。此页

Regular expression pattern not matching anywhere in string

相关问题