[PHP] Wyrażenia regularne - podmienianie fragmentów...

0

Dużo czytałem o wyrażeniach regularnych, ale jakoś nadal nie mogę się z nimi uporać... Może ktoś pomóc? Na dobrą sprawę nie mam pojęcia co robię źle. Może po prostu źle rozumiem używane przeze mnie funkcje. Problem jest taki:

Konstruuje skrypt, który modyfikuje na własne potrzeby dodawane do bazy linki. Jeśli chodzi o instrukcje warunkowe to działają one jak należy. Problem tkwi w podmianie w funkcji ergi_replace(). Gdy definicja target znajduje się na końcu skrypt podmienia dobrze, gdy owa definicja znajduje się gdzieś po środku, czy na początku (gdy nie kończy stringa) wszystko się sypie. Sypie znaczy się, że skrypt kasuje wszystko co znajduje się po podmienionym fragmencie:

<?php
// Link w takiej formie modifikuje się dobrze
$link = "<a href=\"odnośnik\" title=\"tytuł\" target=\"frame\">";
// Link w takiej formie NIE MODYFIKUJE się dobrze
$link = "<a href=\"odnośnik\" target=\"frame\" title=\"tytuł\">";

// Funkcja modyfikujący linki
if (ereg(".+target=\".+\".+", $link)) { // gdy link zawiera już definicję 'targetu'
$link = eregi_replace("target=\".+\"", "target=\"_blank\"", $link);}
else{ // gdy link nie zawiera definicji 'targetu'
$link = str_replace(">", " target=\"_blank\">", $link);}
?>

Próbowałem problem rozwiązać także w inny sposób (poprzez explode()) - również się nie powiodło, choć powinno...:

<?php
$string = "<a title=\"asd\" name=\"asd\" target=\"bla bla\" href=\"erwer\">";
$string = str_replace("=", "", $string);

$tab = explode("\"", $string);

/*
Tablica powstająca w wyniku explode:

$tab[0] => '<a title'
$tab[1] => 'asd'
$tab[2] => 'name'
$tab[3] => 'asd'
$tab[4] => 'target'
$tab[5] => 'bla bla'
$tab[6] => 'href'
$tab[7] => 'erwer'
$tab[8] => '>'

*/

// przeszukiwanie tablicy w celu znalezienia 'target' (NIE ZWRACA ŻADNEJ LICZBY, choć powinna (!!!))
$id = (array_search("target", $tab)); 
// dodawanie 1 by odnaleźć wartość znacznika 'target'
$rid - $id + 1; 
// zastąpienie wartość 'target' własną wartością
$string = str_replace($tab[$rid], "mojeee", $string);
?>

Wiem, że brak tu funkcji 'sklejającej' link, ale to kwestia dosłownie paru minut. Nie wiem już sam co zrobić, bo i tamten sposób nie działa i ten też nie (choć oba powinny działa [nie jestem pewien co do wyrażeń regularnych, ale co do tego sposobu tak!])... Ma ktoś jakąś propozycję... Ja już się chyba poddaje innego sposobu nie znam (oprócz ręcznej zamiany)... :/

PS. Funkcja array_search() tak jakby wybierała sobie co chce znaleźć a co nie... Np. frazy 'asd', 'erwer', '<a title' znajduje... Nie wiem w czym robię błąd, bo ja go szczerze nie widzę...</b>

0

nie jestem dobry z wyrażeń, ale lepiej skorzystaj z prega - ereg jest odradzany...

0

Też nie jestem za mocny w temacie, ale rozwiązanie znalazłem:

	$link = eregi_replace("target=\"[^\"]*\"", "target=\"_blank\"", $link);

Przyczynę znajdziesz na wiki pod hasłem regex ;)

0

a co so array_search, to śmiem twierdzić, że elementu 'target' w niej nie ma :>

var_dump($tab);

edit: żeby oszczędzić Twoje pytanie - każdy element tablicy potraktuj trim(). Ale to tytułem ćwiczeń, zrób tak, jak napisał Sasik ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1