Нужна справка по регулярным выражениям PHP

#php #regex

#php #регулярное выражение

Вопрос:

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

Я пытаюсь (чтобы узнать, пожалуйста, не указывайте мне на API) загрузить файл TSV из Yahoo Site Explorer либо через cURL, либо через file_get_contents (оба работают, просто возятся с разными вещами), а затем с помощью regex отобразить только столбец URL. Я понимаю, что мне могло бы повезти больше с другими функциями, но я не могу найти ничего, связанного с TSV, и теперь это стало проблемой. Я буквально потратил весь день, пытаясь исправить это.

Таким образом, URL-адрес будет:

https://siteexplorer.search .yahoo.com/search ?p = www.google.comamp;bwm= i amp;bwmo =amp;bwmf =s

И мое регулярное выражение в настоящее время выглядит следующим образом (я знаю, что это horrible…it Вероятно, это миллионная попытка):

 preg_match_all('((http(s?)://?(([^/] (/. ))))^[t]$)', $dl, $matches);
  

Моя проблема прямо сейчас в том, что там 4 столбца. ФОРМАТ РАЗМЕРА URL ЗАГОЛОВКА. Я могу удалить все из первого столбца (TITLE) и последнего столбца (FORMAT), но, похоже, я не могу удалить столбец SIZE и избавиться от последней косой черты, если сайты, ссылающиеся в, не имеют этой последней косой черты.

Еще одна вещь — я действительно добился отображения ТОЛЬКО URL-адреса, но у всех них были конечные косые черты, которые пропускают ссылки, скажем, из Twitter.

Любая помощь была бы высоко оценена!

Комментарии:

1. Итак, вам нужен URL, которому присваивается p параметр GET?

2. Если вы учитесь, имело бы смысл использовать многострочный формат регулярных выражений со встроенными комментариями. Это помогло бы вам отслеживать, о чем вы думали, когда писали регулярное выражение. Смотрите раздел добавления комментариев на этой странице для примера.

3. Алекс, нет. Если вы нажмете на ссылку, вам будет предоставлен . Файл TSV, содержащий не менее 1000 ссылок, указывающих на сайт, который вы вводите (в данном случае, Google). Я просто пытался взять данные из этого файла TSV, сохранить их в памяти, а затем использовать regex для отображения каждого URL на экране. Надеюсь, это объясняет это лучше.

Ответ №1:

Я мало знаю о PHP, но это регулярное выражение работает на python (должно быть таким же в PHP):

 ". ?t(. ?)t.*"
  

Просто сопоставьте ее и получите содержимое группы 1. FWIW, код на Python:

 import re
import fileinput

urlre = re.compile(". ?t(. ?)t.*")
for line in fileinput.input():
    m = urlre.match(line)
    if m:
        print m.group(1)
  

Комментарии:

1. Спасибо, регулярное выражение сработало идеально! Вы заставили меня понять, что я все переосмыслил… Я изучал регулярные выражения, просматривая Google, Bing и т.д., Поэтому я так привык к более сложным вещам. Очень круто, спасибо!

2. Кстати, у меня недостаточно репутации, чтобы выдавать какие-либо. Извините!

3. Я рад, что смог помочь. Когда я обнаруживаю, что пишу сверхсложное регулярное выражение, неохотные (ленивые) операторы, такие как *? и ? обычно являются способом упростить все.

Ответ №2:

Лично я бы разделил строки по табуляции. Например:

 $stuff = file_get_contents($url);

// split the whole file by newlines, to get an array of lines
$lines = explode("n", $stuff);

// loop through the lines
foreach ($lines as $line) {
  // split by tab
  $parts = explode("t", $line);

  // put the URLs in a list
  $urls[] = $parts[1];

  // or keep track of them by title
  $urls[$parts[0]] = $parts[1];

  // or whatever...
}
  

Комментарии:

1. Спасибо за это, хотя мне трудно заставить его работать правильно. Я продолжаю получать несколько уведомлений о том, что $ parts [1] — это неопределенное смещение. Не уверен, почему… однако код помогает объяснить, как читать файлы TSV! Если бы у меня была репутация, я бы дал немного!

Ответ №3:

Просто используйте вместо этого parse_url или parse_str. Всегда пытайтесь найти что-нибудь еще, кроме регулярных выражений, которые работают чрезвычайно медленно.