2015-07-10 8 views
2

В PowerShell я пытаюсь использовать regex на блоке <script> и пытаюсь получить список всех тегов скрипта с ссылками jQuery. Все варианты, такие какКак найти ссылку на скрипт?

<script type="text/javascript" src="..." /> 
<script type="text/javascript" src="..."></script> 

а также с различными типами котировок, таких как одиночные или двойные.

Когда я сопоставляю его, я хочу сопоставить их все (глобальные), а затем распечатать все теги скриптов (как показано выше). У меня это до сих пор:

if (($contents -match "src=(.*jquery.*\.js)") -eq $true) { 
    write-host "$($matches[1]) found at $($web.Url)/$url (CONTENTLINK)"; 
    write-host ""; 
} 

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

Примечание: это PowerShell 1.

+0

Не могли бы вы опубликовать HTML фрагмент имеет все теги, которые вы хотите, чтобы соответствовать, а затем покажете нам, что вы на самом деле хотите, чтобы выход был, и что в настоящее время выводит? Также вы говорите, что это не powershell 2.0, так какая версия? – briantist

+2

Я также хочу указать, что хотя я могу попытаться сделать это с помощью регулярного выражения, я настоятельно рекомендую вам [использовать парсер HTML вместо этого, как я рекомендую в этом ответе] (http://stackoverflow.com/a/29930250/3905079). – briantist

+0

У меня нет точного html-фрагмента, так как он собирает их со всего нескольких сотен страниц. – omega

ответ

0

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

Я не думаю, что он получает все матчи и часть печать идет больше, чем тэг точно

Одним из побочных эффектов является то, что он потребляет все, и я имею в виду все.


Вот сценарий, я полагаю, вы хотите

src=\x22(?=.*jquery)([^\x22]+)\x22

Пояснение

  • src= - Anchor текст, который не захвачен, но он соответствует. (Найдено в матче [0], но не соответствует 1)
  • \x22 - Hex escape для " персонаж. Легче использовать в литеральном шаблоне регулярных выражений.
  • (?=) - Посмотрите вперед. Сказать «Я не хочу, чтобы соответствовать, если я не найду то, что в моем опережающего просмотра. Он останавливает матч, если не найден.
  • (?=.*jquery).*jquery где-то, возможно, существует текст .* ноль или более раз, и в буквальном смысле JQuery. Если» JQuery»не найден, остановить обработку в противном случае продолжить
  • ([^\x22]+) -.. мы знаем, что мы собираемся, чтобы соответствовать вещам (), поэтому любой символ ., что не ^ цитата [^\x22] потреблять его в течение 1 или более раза +
  • .
  • \x22 - Матч, но не используйте окончательный текст привязки " будет полным. Также жесткая остановка для обработки .* выше в перспективе.

Протестировано (не в Powershell, но в.Net):

enter image description here

два результата (как найдено совпадений)

enter image description here

Смежные вопросы