Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php]Proste wyrażenie regularne-duży problem
Forum PHP.pl > Forum > Przedszkole
reegen
Witam, mam być może z pozoru prosty problem. Podaje tekst do przefiltrowania. Powiedzmy, że jest on fragmentem źródła strony.
  1. <?php
  2. $text ='<a href="skrypt.php?costam=U" title="jakis tytul">link1</a> |
  3. <a href="skrypt1.php?costam=W" title="tytul">cos tam</a> |
  4. <a href="skrypt2.php?costam=Z" title="jakis tytu">link2</a>
  5. <a href="http://strona.pl" title="jakis tytu">strona link</a>';
  6. ?>


I wyrażenie regularne :

  1. <?php
  2. $tex1 = preg_replace('/href="[^http://](.*)"/', 'href="http://podmien.pl/$1"', $text);
  3. ?>


Chce podmienić wszystkie hrefy jeżeli nie zawierają w sobie "http://" na http://podmien.pl/skryp.php?itd jeżeli href zawiera w sobie http:// ma pozostać bez zmian.
Używając podanego regexpa, linki ze skrypt.php zamienia mi ale ucina pierwsza literę i zostaje http://podmien.pl/krypt.php natomiast <a href="http://strona.pl" title="jakis tytu">strona link</a> zostawia bez mian tak ja chciałem.
Jeżeli zmienię regexpa na :
  1. <?php
  2. $tex1 = preg_replace('/href=[^http://](.*)"/', 'href="http://podmien.pl/$1"', $text);
  3. ?>

czyli bez pierwszego cudzysłowia linki ze skrypt.php juz nie są ucinane ale za to href="http://strona.pl" title="jakis tytu" zamienia na href="http://podmien.pl/http://strona.pl" title="jakis tytu"

Chodzi mi tylko o ten problem. Bardzo proszę nie dawać mi linków do tutoriali itp. mówić żebym sobie przykłady poczytał bo już mam to za sobą. Po prostu nie potrafię zrozumieć ustalania tych reguł.
Czy ktoś ma pomysł jak to poprawić?
nevt
mniej więcej tak:
  1. <?php
  2. $text1 = preg_replace('/href="[^http://](.*?)"/', 'http://podmien.pl/${1}', $text);
  3. ?>

powodzenia
reegen
Cytat(nevt @ 26.11.2007, 23:59:09 ) *
mniej więcej tak:
  1. <?php
  2. $text1 = preg_replace('/href="[^http://](.*?)"/', 'http://podmien.pl/${1}', $text);
  3. ?>

powodzenia


Niestety próbowałem , zmieniałem nie działa, poza tym twoja propozycja pozbywa ze źródła "href" :/
nevt
kolego reegen:
albo nic nie próbowałeś - albo coś źle przepisałeś - testowałem wyrażenie przed zamieszczeniem i na 100% działa poprawnie.
nic nie jest obcinane - co najwyżej tylko tak ci się zdaje, co potwwierdza spostrzeżenie, że nie testowałeś ... a do tego kod który zacytowałeś nie zgadza sie z kodem który tu umieściłem...

wklej przykład (konkretną wartość $text) dla którego nie działa - inaczej będę uważał, że coś ściemniasz.
reegen
Jasne ,że testowałem oto wynik tego testu przy użyciu tego "prawidłowego" wyrażenia i tekstu z mojego posta :

  1. <a [url="http://podmien.pl/krypt.php?costam=U"]http://podmien.pl/krypt.php?costam=U[/url] title="jakis tytul">link1</a> |
  2. <a [url="http://podmien.pl/krypt1.php?costam=W"]http://podmien.pl/krypt1.php?costam=W[/url] title="tytul">cos tam</a> |
  3. <a [url="http://podmien.pl/krypt2.php?costam=Z"]http://podmien.pl/krypt2.php?costam=Z[/url] title="jakis tytu">link2</a>
  4. <a href="http://strona.pl" title="jakis tytu">strona link</a>


Nie wiem czym tkwi błąd długo nad tym siedzie opanowałem już poprawne pisane wyrażeń co gdzie i jak wstawiać ale widocznie droga mojej logiki jest błędna mimo wszystko nevt dziękuje za odpowiedz. Widzę, że użytkownicy niechętnie pomagają. Przez to dziadostwo stoję z robota.
BaN
Sprawdź:
Kod
$text1 = preg_replace('/href="[^http:\/\/](.*?)"/', 'href="http://podmien.pl/${1}"', $text);
nevt
kolego reegen, wieżę, że testowałeś: ale takie wyniki, jak na ekranie są niemożliwe - przed chwilą poświęciłem 15min. żeby to sprawdzić... chyba, że coś jescze robisz między tymi operacjami, albo kod który wstawiasz u siebie, nie jest identyczny z tym tutaj. ale nie ma tego złego, co by na dobre nie wyszło smile.gif testując swój kod znalazłem w nim błąd innego rodzaju, który powodował, że w niektórych przypadkach rozpozanie nie było prawidłowe. tu jest kod po korekcie, tylko błagam - nie pisz mi że znowu nie działa, po prostu zrób kopiuj-wklej... a wrazie problemów spokojnie je opisz...
  1. <?php
  2. $text1 = preg_replace('/href=\"[^h][^t][^t][^p][^:][^/][^/](.*?)\"/', 'href="http://podmien.pl/${1}"', $text);
  3. ?>

a przy okzaji - na tym forum jest wiele osób chętnych do pomocy, ale nie można na nich przenosić odpowiedzialności za to, że coś u ciebie nie działa - im aktywniej współpracujesz przy ustalaniu szczegółów problemu tym szybciej znajdziesz wsparcie...
pozdrawiam i powodzenia.
reegen
Cytat(BaN @ 27.11.2007, 18:18:21 ) *
Sprawdź:
Kod
$text1 = preg_replace('/href="[^http:\/\/](.*?)"/', 'href="http://podmien.pl/${1}"', $text);


Wynik wyrażenia BaN'a :
  1. <a href="http://podmien.pl/krypt.php?costam=U" title="jakis tytul">link1</a> |
  2. <a href="http://podmien.pl/krypt1.php?costam=W" title="tytul">cos tam</a> |
  3. <a href="http://podmien.pl/krypt2.php?costam=Z" title="jakis tytu">link2</a>
  4. <a href="http://strona.pl" title="jakis tytu">strona link</a>


Gdybym wiedział dlaczego ucina pierwszy znak czyli "s" byłbym naprawdę szczęśliwy.
nevt
zwracam honor reegen - moje rozwiązanie nie działało poprawnie na kodzie treści którą pokazałeś, sprawdzałem to na prostszych przypadkach... problem okazał sie niebanalny, bo wyrażenia regularne (o ile wiem) nie wspierają wyszukiwania negatywnego typu NIE 'http'...
ale na wszystko można znaleźć haka smile.gif poniższe rozwiązanie może nie jest superoptymalne, ale działa bezbłędnie na treści którą podajesz:
  1. $text = <<<TEST
  2. <?php
  3. text ='<a href="skrypt.php?costam=U" title="jakis tytul">link1</a> |
  4. <a href="skrypt1.php?costam=W" title="tytul">cos tam</a> |
  5. <a href="skrypt2.php?costam=Z" title="jakis tytu">link2</a>
  6. <a href="http://strona.pl" title="jakis tytu">strona link</a>';
  7. ?>
  8. TEST;
  9.  
  10. $text1 = preg_replace('/href="http:///', 'href#', $text);
  11. $text1 = preg_replace('/href="(.*?)"/', 'href="http://podmien.pl/${1}"', $text1);
  12. $text1 = preg_replace('/href#/', 'href="http://', $text1);
  13.  
  14. echo htmlspecialchars($text).' <br /> '.htmlspecialchars($text1);

baw się dobrze
reegen
No sprawdziłem i śmiga jak trzeba, dziękuje za pomoc .Widzisz tak jak w temacie niby proste heh.

teraz zostało mi jeszcze opanować co w przypadku gdy :

  1. <?php
  2. $text =<a href="/skrypt.php?costam=U" title="jakis tytul">link1</a>
  3. ?>


...będzie slash na początku biggrin.gif
nevt
wystarczy drobna zmiana w drugim replace:
  1. <?php
  2. $text1 = preg_replace('/href="(/?)(.*?)"/', 'href="http://podmien.pl/${2}"', $text1);
  3. ?>
reegen
(\/?) co oznacza wystąpienie / 0 lub więcej razy, te wyrażenia nie są takie ciężkie ale gdy człowiek robi coś logicznie i nie działa to w pewnym momencie się głupieje jak to było w mojej sytuacji.
No więc zabieram do dalszej części mojej roboty W KOŃCU:)
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.