Strona 1 z 1

Wyrażenie regularne- błąd składni wzorca

: 14 sie 2010, 11:18
autor: 5w155
Witam,
Potrzebuję napisać wyrażenie regularne, które "wyciągnie" z tego tekstu:

Kod: Zaznacz cały

<div id="small-list-foto" class="maxSzerokosc">
                      <a rel="zdjecie:0" href="/ogloszenie/zdjecie/1932088_1.html">
              <img alt="" src="http://d.ale.gratka.pl/g2/o/16/7d/a9/1932088_1_f100_m.jpeg">
            </a>
                      <a rel="zdjecie:1" href="/ogloszenie/zdjecie/1932088_2.html">
              <img alt="" src="http://d.ale.gratka.pl/g2/o/16/7d/a9/1932088_2_fad5_m.jpeg">
            </a>
                      <a rel="zdjecie:2" href="/ogloszenie/zdjecie/1932088_3.html">
              <img alt="" src="http://d.ale.gratka.pl/g2/o/16/7d/a9/1932088_3_5b0d_m.jpeg">
            </a>
                      <a rel="zdjecie:3" href="/ogloszenie/zdjecie/1932088_4.html">
              <img alt="" src="http://d.ale.gratka.pl/g2/o/16/7d/a9/1932088_4_c859_m.jpeg">
            </a>
</div>
wszystkie ciągi znaków z sekcji "href".
Pytanie dodatkowe: czemu TO nie działa? :
/<div.*?id="small-list-foto".*?>.*?href="(.*?).html".*?>.*?<\/div>/i

Odp: Wyrażenie regularne- błąd składni wzorca

: 14 sie 2010, 14:39
autor: borzole
Nie napisałeś w jakim języku chcesz to wyciągnąć. W którym języku stawia się /i na końcu ? :)

Odp: Wyrażenie regularne- błąd składni wzorca

: 14 sie 2010, 15:49
autor: beluosus
Twój wzór jest bezsensu, bo po pierwsze regex zazwyczaj czyta po jednej linii tekstu, po drugie jakbyś chciał traktować wszystkie linie jako jedną (/m) to mógłbyś wyłuskać z niej tylko jeden link.

Kod: Zaznacz cały

#!/usr/bin/perl

use strict;

my $in = 0;

while (<>)
{
    if ($in)
    {
        last if (/<\/div>/i);
        print $1 . "\n" if (/.*?href="(.*?).html".*?>.*?/i);
    }
    $in = 1 if (/<div.*?id="small-list-foto".*?>/i);
}
Output:

Kod: Zaznacz cały

/ogloszenie/zdjecie/1932088_1
/ogloszenie/zdjecie/1932088_2
/ogloszenie/zdjecie/1932088_3
/ogloszenie/zdjecie/1932088_4
borzole pisze:W którym języku stawia się /i na końcu ? :)
Powiedz lepiej w którym się nie stawia.

Odp: Wyrażenie regularne- błąd składni wzorca

: 14 sie 2010, 17:28
autor: dam
borzole pisze:W którym języku stawia się /i na końcu ? :)
Modyfikator /i "wyłącza" rozróżnianie wielkości znaków.

W PHP można zrobić tak:

Kod: Zaznacz cały

<?php
$html = '<div id="small-list-foto" class="maxSzerokosc">
                      <a rel="zdjecie:0" href="/ogloszenie/zdjecie/1932088_1.html">
              <img alt="" src="http://d.ale.gratka.pl/g2/o/16/7d/a9/1932088_1_f100_m.jpeg">
            </a>
                      <a rel="zdjecie:1" href="/ogloszenie/zdjecie/1932088_2.html">
              <img alt="" src="http://d.ale.gratka.pl/g2/o/16/7d/a9/1932088_2_fad5_m.jpeg">
            </a>
                      <a rel="zdjecie:2" href="/ogloszenie/zdjecie/1932088_3.html">
              <img alt="" src="http://d.ale.gratka.pl/g2/o/16/7d/a9/1932088_3_5b0d_m.jpeg">
            </a>
                      <a rel="zdjecie:3" href="/ogloszenie/zdjecie/1932088_4.html">
              <img alt="" src="http://d.ale.gratka.pl/g2/o/16/7d/a9/1932088_4_c859_m.jpeg">
            </a>
</div>';

preg_match_all('/<a.*?rel="zdjecie:\d".*?href="(.+)\.html".*?>/i', $html, $array);

print_r($array[1]);
?>
Co zwróci

Kod: Zaznacz cały

Array
(
    [0] => /ogloszenie/zdjecie/1932088_1
    [1] => /ogloszenie/zdjecie/1932088_2
    [2] => /ogloszenie/zdjecie/1932088_3
    [3] => /ogloszenie/zdjecie/1932088_4
)

Odp: Wyrażenie regularne- błąd składni wzorca

: 14 sie 2010, 18:40
autor: borzole
@beluosus
np. w sed lub python. Widzę, że w Perl/Ruby jest, których nie znam wcale.

Odp: Wyrażenie regularne- błąd składni wzorca

: 14 sie 2010, 23:20
autor: 5w155
Chodziło mi o PHP i całkowicie mnie usatysfakcjonowaliście :) Dzięki!