Каков наилучший способ найти и заменить URL в гигантском тексте? - PullRequest
0 голосов
/ 19 января 2009

У меня есть огромная резервная копия постов моего блога. Все сообщения имеют изображения, такие как:

"http://www.mysite.com/nonono-nonono.jpg"

или

"http://www.mysite.com/nonono-nonono.gif"

или даже

"http://www.mysite.com/nonono.jpg"

Но у меня есть другие ссылки для URL-адресов в том же домене, например "" http://www.mysite.com/category/post.html", и я просто хочу заменить URL-адреса изображений (к счастью, все изображения находятся в корне сайта).

Мне нужно изучить RegExp, чтобы сделать это? Есть ли какой-нибудь мощный инструмент для поиска и замены таких текстов? Спасибо

Ответы [ 6 ]

1 голос
/ 19 января 2009

Это возможно с регулярными выражениями, но я бы, вероятно, написал скрипт на Python, используя Beautiful Soup :

# fix_imgs.py
import sys
from BeautifulSoup import BeautifulSoup
for filename in sys.argv[1:]:
  contents = open(filename).read()
  soup = BeautifulSoup(contents)

  # replacing each img tag
  for img in soup.findAll('img'):
    img.src = img.src.replace("http://www.mysite.com", "http://www.example.com")

  new_contents = str(soup)
  output_filename = "replaced." + filename
  open(output_filename, "w").write(new_contents)
1 голос
/ 19 января 2009

Я использую RegExp на EditPad Pro. Я также найду хороший учебник для начинающих. Спасибо за подсказку @ CalvinR ​​

1 голос
/ 19 января 2009

Регулярные выражения, безусловно, являются одним из способов сделать это и, вероятно, наиболее гибким. Но если все ваши URL-адреса изображений начинаются с "http://www.mysite.com/" и заканчиваются на" .jpg ", то вы можете использовать функции манипуляции со строками. Например, если у вас есть строковая переменная с именем s, которую вы хотите проверить:

const string mysite = "http://www.mysite.com/";
const string jpg = ".jpg";
string newString = string.Empty;
if (s.BeginsWith(mysite))
{
    if (s.EndsWith(jpg))
    {
        string textToReplace = s.SubString(mysite.Length, s.Length - mysite.Length - jpg.Length);
        newString = s.Replace(textToReplace, "whatever you want to replace it with.");
    }
}

Это довольно грубый метод, но он будет работать.

1 голос
/ 19 января 2009

Регулярные выражения будут вашим лучшим выбором ... может быть, что-то вроде этого (на основе одного из strfriend )?

^((ht|f)tp(s?)\:\/\/|~/|/)?([\w]+:\w+@)?([a-zA-Z]{1}([\w\-]+\.)+([\w]{2,5}))(:[\d]{1,5})?((/?\w+/)+|/?)(\w+\.(jpg|gif|png))?
0 голосов
/ 19 января 2009

Честно говоря, я думаю, что вы должны изучать регулярные выражения независимо от того, это отличный инструмент, чтобы держать себя в руках, особенно в таких ситуациях, как это. Это чрезвычайно мощный инструмент для работы со строками, Perl также является отличным языком для изучения в то же время, что и использование Reg Exps на одном дыхании.

0 голосов
/ 19 января 2009

Чтобы заменить все имена файлов на 'new_image_name_here' в URL-адресах изображений:

$ perl -pe's~(http://.*?/)[^/]+?\.(jpg|gif)\b~$1new_image_name_here.$2~g' huge_file.html > output.html

Чтобы заменить деталь netloc на 'www.othersite.org' в 'http://<netloc>/<image_path>':

$ perl -pe's~(?<=http://)[^/]+(?=/(?:[^/]+/)*[^/]+?\.(?:jpg|gif)\b)~www.othersite.org~g' huge_file.html > output.html

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...