2016-09-14 4 views
0

Я пытаюсь получить все файловые ресурсы внутри HTML.Preg_match_all не дает те же результаты, что и preg_match

Моя текущая версия регулярных выражений является

"[^']*'([^"]*)'[^']*" | "([^"]*)" 

Пример HTML (только часть):

<div style="background-image: url('/courses/UMASGRUPOBDEMO/document/learning_path/El_Contrato_de_Seguro-_Contenido_Teorico/video_pres_cto_seguro.jpg');display: block; margin-left: auto; margin-right: auto;"></div> 

         <img class="maximize" 
src="/courses/CURSODESTINOPEQUENO/document/learning_path/LECCION_1_2_3_4_5_-_corta/Diapositiva01-29332.jpg" style="display: block; margin-left: auto; margin-right: auto;" /> 

Итерация preg_match я могу получить:

  • /курсы/UMASGRUPOBDEMO /document/learning_path/El_Contrato_de_Seguro-_Contenido_Teorico/video_pres_cto_seguro.jpg
  • увеличить
  • /courses/CURSODESTINOPEQUENO/document/learning_path/LECCION_1_2_3_4_5_-_corta/Diapositiva01-29332.jpg

Но preg_match_all только дать мне следующий:

  • /курсы/UMASGRUPOBDEMO/документ/learning_path/El_Contrato_de_Seguro-_Contenido_Teorico/video_pres_cto_seguro.jpg

Вы можете жить тест его на http://www.phpliveregex.com/p/h6T

Имеет ли это смысл? Возможно, моему регулярному выражению нужно что-то работать.

У меня не так много опыта с регулярным выражением. Пожалуйста, помогите мне :)

Спасибо вам заранее!

Добавлено:

Регулярное выражение на самом деле что-то вроде:

  • любой строки с разделителями в двойных кавычках, который содержит любую строку без двойных кавычек, а также содержит две кавычки внутри с дополнительным содержанием в между ними
  • или две двойные кавычки с дополнительным содержанием внутри (без двойных кавычек)

Как я вижу, может быть, не котировки и не двойные кавычки условия должны быть затронуты немного, чтобы лучше регулярное выражение ...

Теперь, используя более длинный пример HTML: http://www.phpliveregex.com/p/h74

<p><img class="maximize" src="/courses/UMASGRUPOBDEMO/document/learning_path/Diapositiva54/Diapositiva2.jpg" style="display: block; margin-left: auto; margin-right: auto;" alt="" /></p> 

<div style="background-image: url('/courses/UMASGRUPOBDEMO/document/learning_path/El_Contrato_de_Seguro-_Contenido_Teorico/video_pres_cto_seguro.jpg');display: block; margin-left: auto; margin-right: auto;"></div> 

         <img class="maximize" 
src="/courses/CURSODESTINOPEQUENO/document/learning_path/LECCION_1_2_3_4_5_-_corta/Diapositiva01-29332.jpg" style="display: block; margin-left: auto; margin-right: auto;" /> 
+0

Во-первых - измените свой вопрос, чтобы добавить 4 дополнительных пробелов после '> ', так что регулярное выражение es не отформатированы. –

+0

Хорошо, и я также выделил две части OR, чтобы это стало легче. – LanderTaker

ответ

1

Попробуйте это регулярное выражение вместо:

"[^"']*'([^"']*)'[^"']*"|"([^"]*)" 

Ваш original regex жадно подбирал все, начиная с после второго ' до Последнее" на входе.

Помните, что * и + операторы в регулярном выражении являются жадный означает, что они будут потреблять как можно больше для того, чтобы соответствовать.

Вы должны либо ограничить то, что эти операторы применяются к (как я выше) или превратить их в нежадные оператор для систем регулярных выражений, которые поддерживают его, используя *? или +?:

"[^']*?'[^"]*?'[^']*?" 

(Тем не менее, этот последний будет по-прежнему есть проблемы, например, с <img src="foo" alt='bar' class="myimage" /> - который будет захватывать 'bar', даже если это не является частью " -delimited строки)

+0

Первый работает как шарм! (насколько я видел!). Да, второй нужен какой-то труд, но я думаю, что у меня есть идея. – LanderTaker