php regex: получить значение src

Как получить все значение src с помощью regex в php?

<script type="text/javascript" src="http://localhost/assets/javascript/system.js" charset="UTF-8"></script> <script type='text/javascript' src='http://localhost/index.php?uid=93db46d877df1af2a360fa2b04aabb3c' charset='UTF-8'></script> 

Полученное значение должно содержать только:

  • Http: //localhost/assets/javascript/system.js
  • HTTP: //localhost/index.php UID = 93db46d877df1af2a360fa2b04aabb3c

Спасибо.

 /src=(["'])(.*?)\1/ 

пример:

 <?php $input_string = '<script type="text/javascript" src="http://localhost/assets/javascript/system.js" charset="UTF-8"></script>'; $count = preg_match('/src=(["\'])(.*?)\1/', $input_string, $match); if ($count === FALSE) echo('not found\n'); else echo($match[2] . "\n"); $input_string = "<script type='text/javascript' src='http://localhost/index.php?uid=93db46d877df1af2a360fa2b04aabb3c' charset='UTF-8'></script>"; $count = preg_match('/src=(["\'])(.*?)\1/', $input_string, $match); if ($count === FALSE) echo('not found\n'); else echo($match[2] . "\n"); 

дает:

 http://localhost/assets/javascript/system.js http://localhost/index.php?uid=93db46d877df1af2a360fa2b04aabb3c 

Может быть, это только я, но мне не нравятся регулярные выражения для поиска вещей в кусках HTML, особенно когда HTML непредсказуем (возможно, это происходит от пользователя или других веб-страниц).

Как насчет чего-то вроде этого:

 $doc = <<<DOC <script type="text/javascript" src="http://localhost/assets/javascript/system.js" charset="UTF-8"></script> <script type='text/javascript' src='http://localhost/index.php?uid=93db46d877df1af2a360fa2b04aabb3c' charset='UTF-8'></script> 
 DOC; $dom = new DomDocument; $dom->loadHTML( $doc ); $elems = $dom->getElementsByTagName('*'); foreach ( $elems as $elm ) { if ( $elm->hasAttribute('src') ) $srcs[] = $elm->getAttribute('src'); } print_r( $srcs ); 

Я не знаю, что такое разница в скорости между этим и регулярным выражением, но мне нужно много времени, чтобы прочитать его и понять, что я пытаюсь сделать.

Я согласен с Ником, используйте объект DomDocument для извлечения ваших данных. Вот версия xpath:

 $doc = <<<DOC <script type="text/javascript" src="http://localhost/assets/javascript/system.js" charset="UTF-8"></script> <script type='text/javascript' src='http://localhost/index.php?uid=93db46d877df1af2a360fa2b04aabb3c' charset='UTF-8'></script> DOC; $doc = new DomDocument; $doc->loadHTML($doc); $xpath = new DomXpath($doc); $elements = $xpath->query('//[@src]'); foreach($elements as $element) { echo $element->nodeValue; } 

Если вы решите пойти по маршруту регулярного выражения, это должно быть полезно для вас

 /(?<=\<).*?src=(['"])(.*?)\1.*?(?=/?\>)/si 

Метод jQuery

 var Scripts = []; $('head script').each(function(){ if($(this).attr('type') == 'text/javascript' && $(this).attr('src')){ Scripts.push($(this).attr('src')); } }); console.log(Scripts)