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