Autor Zpráva
Budry
Profil
Zdravím,
zpracovávám právě větší množství dat, která musím projít a prohnat parserem a upravit na požadovaný tvar, problém je v tom že regulár, který jsem na to dal dohromady je enormě náročný a dostávám error "Segmentation fault"

Potřebuji v libovolném stringu obsahujím html najít tuto strukturu:

<a class="photo" href="http://example.com/some/image.png" target="_blank">
        <img height="98" src="some/image.png" width="130"/>
    </a>
S tím, že je nutné najít pouze tagy <a> obsahující class="photo" a pak tento kus kódu nahradit kodem takovýmto:

<img height="98" src="/some/image.png" width="130"/>

Pokud bych to měl popsat, potřebuji najít všechny tagy <a> s class="photo" a ty nahradit pouze tagem <img> který je uvnitř stím že na začátek src="" se vloží lomítko.

Regulár, který se mi podařil dát dohormady:

$pattern = '~<a(((?!class="photo").)*)class="photo"([^>]+?)>\s*<img(((?!src).)*)src="([^"]+?)"([^>]+?)>\s*</a>~';
$replace = '<img${4}src="/${6}"${7}>';
$out = preg_replace($pattern, $replace, $text);

Regulár funguje přesně jak je potřeba, bohužel se mi nepodařilo dát dohromady nějakou mín náročnou podobu a po chvíli tak celý program spadne s Segmentation fault

Mohl by mi někdo poradit jak tento regulár opravit? Popřípadě jak jinak lépe tento problém vyřešit?

Předem díky
Tori
Profil
A potřebujete opravdu ověřovat, jestli nebyla stejná třída zadaná dvakrát? Možná by stačilo

$re = '~<a\s+[^>]*?class=(["\'])photo\\1[^>]+?>\s*(<img.*?\s+src=(["\']))/?(.+?)(\\3.*?>)\s*</a>~isu';
$out = preg_replace($re, '$2/$4$5', $text);
edit: ještě jsem to trochu zjednodušila.
Jan Tvrdík
Profil
Budry:
Nevymýšlej blbosti s regulárama a radši na to použij funkce pro práci s DOMem.
Budry
Profil
Jan Tvrdík:
Kruci, to mě nenapadlo... máš pravdu, bude to lepší

Dík oboum :-)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: