Autor Zpráva
MartinX
Profil *
Ahoj,

prosím o pomoc s konstrukcí regexu. Mám např. text:

<path class="st0" d="M"/>
<path class="st1" fill="1" d="N"/>
<path class="st2" d="O"/>

Pak mám regulární výraz, který vytáhne vše mezi začátkem "<path" a koncem ">".
To funguje dobře:

$str = preg_replace("/<path(.*?)>/i", "$1", $str);


Nedaří se mi ale dosáhnout toho, aby se přeskočil řádek, pokud obsahuje slovo "fill".
Když použiju toto, tak regex správně zpracuje první řádek, druhý řádek správně přeskočí, ale třetí řádek už dál neřeší:

$str = preg_replace("/<path(.*?)(?!fill)>/i", "$1", $str);

Prosím, co s tím? :-)

Děkuji,
M.
Kajman
Profil
Příkaz replace nevytahuje, ale mění string.

Pokud znamená přeskočení řádku zachování původní hodnoty, tak by třeba šlo použít příbuznou funkci preg_replace_callback pro dodatečné filtrování
$str = preg_replace_callback("/<path([^>]*)>/i", 
                             function($match) { return (preg_match('/fill/', $match[1])?$match[0]:$match[1]); },
                             $str);
MartinX
Profil *
Špatně jsem se vyjádřil, ale správně jsi mě pochopil :-).

Děkuji za nakopnutí - preg_replace_callback funguje přesně tak, jak potřebuji. Tedy že string, který obsahuje slovo "fill", zůstane nezměněn v původní hodnotě. A string, který toto slovo neobsahuje, bude nahrazen tím, co si navolím.

Děkuju moc, pomohlo mi to :-),
M
MartinX
Profil *
Ještě doplňuji, pokud by se to někdy někomu hodilo... Podařilo se mi vyřešit přímo ten regex, takže není nutné používat preg_replace_callback.

$str = preg_replace("/<path(?![^>]*\bfill\b)(.*?)>/i", "$1", $str);

Nevím, do jaké míry je to správně, ale pro mé potřeby to funguje :-).
Kcko
Profil
MartinX:
Kajmanův způsob je více flexibilní a v callbacku toho můžeš do budoucna udělat mnohem víc a rychleji, než pak upravovat tvůj regexp, který může časem nabobtnat a ani to třeba nepůjde už snadno udělat.

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:

0