Discussion:
Pomoc z wyrażeniem regularnym
(Wiadomość utworzona zbyt dawno temu. Odpowiedź niemożliwa.)
Roman Tyczka
2020-03-23 13:42:46 UTC
Permalink
Witam,

Mam np. taki kodzik w htmlu:

<tbody><img src="dubaj.png">

<audio src="plik.png">

<tr align="center" style="vertical-align: top; display: inline-block;
text-align: center;" valign="top">

<td style="word-break: break-word; vertical-align: top; padding-bottom:
5px; padding-right: 3px; padding-left: 3px;"
valign="top"><img type="" src="chusta.png">

<a href="https://www.facebook.com/" target="_blank">

<img alt="Facebook" height="32" src="images/***@2x.png"
style="text-decoration: none; -ms-interpolation-mode: bicubic; height:
auto; border: none; display: block;" title="Facebook" width="32"/></a>
</td>

I teraz, żeby wydobyć wszystkie nazwy plików z tagów <img> używam
wyrażenia:

<img.*?src="(.*?)".*?>

i mam 3 matche i 3 nazwy plików. To jest ok.

Ale teraz chciałbym wyciągnąć pełną nazwę konkretnego pliku (wraz ze
ścieżką względna) np. ***@2x.png, czyli w rezultacie chcę dostać:

images/***@2x.png

Stosuję takiego reexpa:

<img.*?src="(.*?***@2x\.png)".*?>

i dupa... dostaję bzdury.

Jak to zrobić poprawnie? Co robię źle?
--
pozdrawiam
Roman Tyczka
Łukasz 'Maly' Ostrowski
2020-03-23 15:22:28 UTC
Permalink
<ciach>
Ale teraz chciałbym wyciągnąć pełną nazwę konkretnego pliku (wraz ze
i dupa... dostaję bzdury.
Jakie bzdury? To pomoże w diagnozie ;-). p.s. Pierwszy wildcard zrobiłbym
.+?, albo nawet \s.*? - bo tam powinien być jakiś whitespace po img ;-).
Jak to zrobić poprawnie? Co robię źle?
Na moje oko wygląda okay. Podejrzewam, że jest informacja której nie
podałeś. Zwróć uwagę też na tryby multi/single-line, tagi XHTML mogą być
"złamane".

Evidence: https://imgur.com/a/cNryhCy

Najlepiej wrzuć przykładowe inputy i regexy na pastebin albo coś podobnego,
łatwiej o diagnozę jeżeli gramy w grę z pełną informacją ;-).
--
Pozdrawiam,
Łukasz 'Mały' Ostrowski.
Roman Tyczka
2020-03-23 16:41:48 UTC
Permalink
Post by Łukasz 'Maly' Ostrowski
Post by Roman Tyczka
i dupa... dostaję bzdury.
Jakie bzdury? To pomoże w diagnozie ;-). p.s. Pierwszy wildcard zrobiłbym
.+?, albo nawet \s.*? - bo tam powinien być jakiś whitespace po img ;-).
Post by Roman Tyczka
Jak to zrobić poprawnie? Co robię źle?
Na moje oko wygląda okay. Podejrzewam, że jest informacja której nie
podałeś. Zwróć uwagę też na tryby multi/single-line, tagi XHTML mogą być
"złamane".
Evidence: https://imgur.com/a/cNryhCy
Najlepiej wrzuć przykładowe inputy i regexy na pastebin albo coś podobnego,
łatwiej o diagnozę jeżeli gramy w grę z pełną informacją ;-).
Ok, zrzut z RegexBuddy:

Loading Image...

W Twoim wyrażeniu jest po prawej stronie przełącznik /gm - co on robi?
--
pozdrawiam
Roman Tyczka
Roman Tyczka
2020-03-23 17:02:54 UTC
Permalink
Post by Łukasz 'Maly' Ostrowski
<ciach>
Ale teraz chciałbym wyciągnąć pełną nazwę konkretnego pliku (wraz ze
i dupa... dostaję bzdury.
Jakie bzdury? To pomoże w diagnozie ;-). p.s. Pierwszy wildcard zrobiłbym
.+?, albo nawet \s.*? - bo tam powinien być jakiś whitespace po img ;-).
Jak to zrobić poprawnie? Co robię źle?
Na moje oko wygląda okay. Podejrzewam, że jest informacja której nie
podałeś. Zwróć uwagę też na tryby multi/single-line, tagi XHTML mogą być
"złamane".
Evidence: https://imgur.com/a/cNryhCy
Najlepiej wrzuć przykładowe inputy i regexy na pastebin albo coś podobnego,
łatwiej o diagnozę jeżeli gramy w grę z pełną informacją ;-).
Teraz też zobaczyłem, że zmodyfikowałeś tekst wejściowy i zrobiłeś całego
taga <img> w jednym wierszu, mimo, że był w moim przykładzie
"poenterowany". Gdy przedzielisz linię w Twoim przykładzie, w dowolnym
miejscu po atrybucie src, ale przezd końcowym > to Twój przykład też
przestanie działać.
--
pozdrawiam
Roman Tyczka
Roman Tyczka
2020-03-23 17:22:29 UTC
Permalink
Post by Roman Tyczka
Post by Łukasz 'Maly' Ostrowski
Na moje oko wygląda okay. Podejrzewam, że jest informacja której nie
podałeś. Zwróć uwagę też na tryby multi/single-line, tagi XHTML mogą być
"złamane".
Evidence: https://imgur.com/a/cNryhCy
Najlepiej wrzuć przykładowe inputy i regexy na pastebin albo coś podobnego,
łatwiej o diagnozę jeżeli gramy w grę z pełną informacją ;-).
Teraz też zobaczyłem, że zmodyfikowałeś tekst wejściowy i zrobiłeś całego
taga <img> w jednym wierszu, mimo, że był w moim przykładzie
"poenterowany". Gdy przedzielisz linię w Twoim przykładzie, w dowolnym
miejscu po atrybucie src, ale przezd końcowym > to Twój przykład też
przestanie działać.
No i to doprowadziło mnie do mety. Po pierwsze trzeba włączyć opcje "dot
match line breaks", żeby traktował cały blok jako jedną linię. Oraz opcję
ungreedy - choć tego zupełnie nie rozumiem, bo przecież po to dawałem
pytajniki, żeby kwantyfikatory nie były zachłanne. Niemniej po użyciu (?U)
zaczęło działać.
Kto umie wyjaśnić co zmienia dodanie (?U) proszony jest o zabranie głosu.

Ostateczny wzorzec:

(?s)(?U)<img.+?src="(.*?***@2x\.png)".*?>
--
pozdrawiam
Roman Tyczka
Łukasz 'Maly' Ostrowski
2020-03-23 20:59:14 UTC
Permalink
<snip>
IMO już samo ? powinno wystarczyć, może używasz
jakiegoś dziwnego enginu RE. Widziałeś moje
przykłady z regex101 - było okay. I dlatego
wspominałem też o single-line/multiline, bo to
właśnie jest ". matches new line".
--
Pozdrawiam,
Łukasz 'Mały' Ostrowski.
M.M.
2020-03-23 21:31:08 UTC
Permalink
Post by Roman Tyczka
Witam,
<tbody><img src="dubaj.png">
<audio src="plik.png">
<tr align="center" style="vertical-align: top; display: inline-block;
text-align: center;" valign="top">
5px; padding-right: 3px; padding-left: 3px;"
valign="top"><img type="" src="chusta.png">
<a href="https://www.facebook.com/" target="_blank">
auto; border: none; display: block;" title="Facebook" width="32"/></a>
</td>
I teraz, żeby wydobyć wszystkie nazwy plików z tagów <img> używam
<img.*?src="(.*?)".*?>
i mam 3 matche i 3 nazwy plików. To jest ok.
Ale teraz chciałbym wyciągnąć pełną nazwę konkretnego pliku (wraz ze
i dupa... dostaję bzdury.
Jak to zrobić poprawnie? Co robię źle?
Bez kompilacji, bez testowania:

Może tak, najpierw takim dla ścieżek w pojedynczych:
<img[^>]+src\s*=\s*'([^']*)'[^>]*>

Potem takim, gdy ścieżki są w podwójnych:
<img[^>]+src\s*=\s*"([^"]*)"[^>]*>

Pozdrawiam

Kontynuuj czytanie narkive:
Loading...