Intereting Posts
XMLReader – как обрабатывать незадекларированное пространство имен Кнопка входа в Facebook: могу ли я предотвратить перезагрузку страницы после входа в систему? Как использовать переменные PHP, заключенные в двойном проценте (%% variable %%) внутри html Получите понедельники и т.д. API-интерфейс Google Drive PHP – простая загрузка файлов Готово ли Drupal для предприятия? PHP эквивалентен верхней команде Linux Как я могу отправить XML SOAP через Curl и PHP? html5 <input type = "file" accept = "image / *" capture = "camera"> показывать как изображение, а не кнопку выбора файла Концептуальная проблема Symfony2: общие пакеты по сравнению с конкретными Использование jQuery для отправки данных из multipart / form-data через ajax Проблема с файловой системой PHP, код возврата 2 Получить все расширенные классы в PHP Ошибка при попытке отправить новый пароль на электронную почту php fopen не работает на моем сервере

Regex сопоставляет img-тег с определенным классом атрибутов

Я очень долго борюсь с этим выражением регулярного выражения, но я не могу найти никаких исправлений. Я использовал инструменты, основанные на 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+) на этой странице

Шаблон регулярного выражения, не совпадающий нигде в строке