Я очень долго борюсь с этим выражением регулярного выражения, но я не могу найти никаких исправлений. Я использовал инструменты, основанные на javascript, для тестирования и записи выражения. При вводе на php-страницу и сопоставлении с preg результаты разные.
/(<img\b src=)"([^"]+)"(.* class=".*colorme(?:.|[^"]*)"[^>]+>)/
И примеры для тестирования здесь, первое не должно совпадать. ЭТО ВСЕ РАБОТЫ с javascript, но не с php, будут сопоставляться только классы class = "colorme". Я что-то упускаю ?
<img src="http://img.ruphp.com/php/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://img.ruphp.com/php/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 Document с чем-то вроде XPath было бы намного проще, но для ваших целей регулярное выражение абсолютно нормально . Если вы пытаетесь совместить только один тег или так, вы всегда можете сделать правильное выражение регулярных выражений, только когда вы начинаете пытаться сделать больше, чем это, вы начинаете видеть недостатки регулярных выражений в поле, которые большинство людей, похоже, забывают.
Итак, в заключение вы должны использовать парсер HTML, но вы можете использовать регулярное выражение. Никакого закона нет. Я бы предложил вам использовать DOM и XPath для этого, но если вы хотите сделать это как регулярное выражение, посмотрите на второй ответ (тот, у которого есть оценка 300+) на этой странице
Шаблон регулярного выражения, не совпадающий нигде в строке