Как удалить часть URL с регулярными выражениями? - PullRequest
0 голосов
/ 13 июня 2011

Как я могу превратить это:

http://site.com/index.php?id=15

В это?:

http://site.com/index.php?id=

Какие RegEx (ы) я использую?

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

Я использую Bing!вместо Google.

Мой RegEx до сих пор таков, когда я что-то ищу:

$start = '<h3><a href="';
$end = '" onmousedown=';

while ($result =~ m/$start(.*?)$end/g)

Что я могу добавить в их, чтобы вынуть буквы и цифры в конце и просто оставить егокак знак равенства?

Спасибо.

Ответы [ 4 ]

3 голосов
/ 13 июня 2011

Поскольку вы не можете правильно проанализировать [X] HTML с помощью регулярных выражений, вам следует искать минимально возможный контекст, который даст вам необходимую информацию.

Насколько мне известно, один символ, который не может быть в href - ". поэтому

/href="([^"]+)"/

Должен дать URL в $1. Я хотел бы проверить его на предмет URL-адреса, прежде чем извлечь нужную строку идентификатора, а затем:

s/\?id=\w+/id=/

Но это хак написано повсюду, , потому что вы не можете анализировать HTML с помощью регулярных выражений . Так что, вероятно, он сломается, когда вы впервые продемонстрируете это клиенту.

Вы действительно должны проверить правильность анализа Perl: http://www.google.com/webhp?q=perl+html+parser

1 голос
/ 13 июня 2011

Вы запросили решение для регулярных выражений, но ваша проблема немного не определена, и регулярные выражения для HTML предназначены только для стоп-лосс / одноразовых вещей, иначе вы, вероятно, просто наносите себе вред.

Поскольку я на самом деле не уверен, каковы ваши реальные потребности и исходный код HTML, это общее решение для получения URL-адреса и размещения всех ссылок, найденных на странице, без строк запроса.Наличие id= для всех разумных целей / кода эквивалентно отсутствию идентификатора.

Существует множество способов, по крайней мере три или четыре из которых являются хорошими решениями, сделать это в Perl.Это тот, который часто упускается из виду: libxml.Документы: XML :: LibXML , URI и URI :: QueryParam (если вы хотите улучшить обработку запросов).

use warnings;
use strict;
use URI;
use XML::LibXML;

my $source = shift || die "Give a URL!\n";

my $parser = XML::LibXML->new;
$parser->recover(1);

my $doc = $parser->load_html( location => $source );

for my $anchor ( $doc->findnodes('//a[@href]') )
{
    my $uri = URI->new_abs( $anchor->getAttribute("href"), $source );
    # commented out ideas.
    # next unless $uri->host eq "TARGET HOST NAME";         
    # next unless $uri->path eq "TARGET PATH";
    # Clear the query completely; id= might as well be nothing.
    $uri->query(undef);
    print $uri, $/;
}

Похоже, вы используете Bing!для соскоба.Подобные вещи против почти всех поисковых систем поисковых систем.Не делай этого.У них есть API (ну, по крайней мере, у Google), если вы зарегистрируетесь и получите токен разработчика.

0 голосов
/ 13 июня 2011

Как я могу превратить это:

http://site.com/index.php?id=15

В это?:

http://site.com/index.php?id=

Я думаю, это решение, которое вы ищете

#!/usr/bin/perl
use strict;
use warnings;
my $url="http://site/index.php?id=15";
$url =~  s/(?<=id=).*//g;
print $url;

Вывод:

http://site.com/index.php?id=

в соответствии с вашими потребностями после знака = будет опущено в URL

0 голосов
/ 13 июня 2011

Я не уверен на 100%, что вы делаете, но это проблема:

while ($result =~ m/$start(.*?)$end/g)

Какова цель этого цикла? Вы берете скаляр с именем $result и проверяете соответствие шаблону. Как меняется $result?

Ваш оригинальный вопрос был, как это сделать:

http://site.com/index.php?id=15

в это:

http://site.com/index.php?id=

То есть как вы удаляете 15 (или другое число) из выражения. Ответ довольно прост:

$url =~ s/=\d+$/=/;

Это будет привязывать ваше регулярное выражение в конце URL, заменяя конечные цифры ничем.

Если вы удаляете какую-либо строку, она немного сложнее:

$url =~ s/=[^=]+/=/;

Вы не можете просто использовать \S+, потому что регулярные выражения обычно жадные. Поэтому вы хотите указать любую серию символов со знаком, отличным от знака равенства, перед которыми стоит знак равенства.

Теперь, что касается цикла while, может быть, вы хотите вместо него оператор if ...

if ($result =~ /$start(.*?)$end/g) {
    print "Doing something if this matched\n";
}
else {
    print "Doing something if there's no match\n";
}

И я не уверен, что это значит:

Я использую Bing! вместо Google.

Вы пытаетесь проанализировать ввод от Bing !? Если да, пожалуйста, объясните, что вы на самом деле пытаетесь сделать. Может быть, мы знаем лучший способ сделать это. Например, если вы анализируете выходные данные результатов поиска, возможно, вы можете использовать API.

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