Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php]Proste wyrażenie regularne-duży problem, konkretny krótki przypadek
reegen
post 26.11.2007, 19:44:15
Post #1





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 19.01.2007

Ostrzeżenie: (0%)
-----


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ć?

Ten post edytował reegen 27.11.2007, 16:10:07
Go to the top of the page
+Quote Post
nevt
post 26.11.2007, 22:59:09
Post #2





Grupa: Przyjaciele php.pl
Postów: 1 595
Pomógł: 282
Dołączył: 24.09.2007
Skąd: Reda, Pomorskie.

Ostrzeżenie: (0%)
-----


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

powodzenia


--------------------

-
Oh no, my young coder. You will find that it is you who are mistaken, about a great many things... -
Go to the top of the page
+Quote Post
reegen
post 26.11.2007, 23:23:56
Post #3





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 19.01.2007

Ostrzeżenie: (0%)
-----


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" :/

Ten post edytował reegen 26.11.2007, 23:30:33
Go to the top of the page
+Quote Post
nevt
post 27.11.2007, 08:44:14
Post #4





Grupa: Przyjaciele php.pl
Postów: 1 595
Pomógł: 282
Dołączył: 24.09.2007
Skąd: Reda, Pomorskie.

Ostrzeżenie: (0%)
-----


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.


--------------------

-
Oh no, my young coder. You will find that it is you who are mistaken, about a great many things... -
Go to the top of the page
+Quote Post
reegen
post 27.11.2007, 16:17:09
Post #5





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 19.01.2007

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
BaN
post 27.11.2007, 18:18:21
Post #6





Grupa: Zarejestrowani
Postów: 158
Pomógł: 43
Dołączył: 9.11.2007

Ostrzeżenie: (0%)
-----


Sprawdź:
Kod
$text1 = preg_replace('/href="[^http:\/\/](.*?)"/', 'href="http://podmien.pl/${1}"', $text);
Go to the top of the page
+Quote Post
nevt
post 27.11.2007, 18:48:54
Post #7





Grupa: Przyjaciele php.pl
Postów: 1 595
Pomógł: 282
Dołączył: 24.09.2007
Skąd: Reda, Pomorskie.

Ostrzeżenie: (0%)
-----


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.

Ten post edytował nevt 27.11.2007, 19:00:51


--------------------

-
Oh no, my young coder. You will find that it is you who are mistaken, about a great many things... -
Go to the top of the page
+Quote Post
reegen
post 27.11.2007, 18:50:58
Post #8





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 19.01.2007

Ostrzeżenie: (0%)
-----


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.

Ten post edytował reegen 27.11.2007, 18:53:32
Go to the top of the page
+Quote Post
nevt
post 27.11.2007, 19:20:47
Post #9





Grupa: Przyjaciele php.pl
Postów: 1 595
Pomógł: 282
Dołączył: 24.09.2007
Skąd: Reda, Pomorskie.

Ostrzeżenie: (0%)
-----


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


--------------------

-
Oh no, my young coder. You will find that it is you who are mistaken, about a great many things... -
Go to the top of the page
+Quote Post
reegen
post 27.11.2007, 19:27:34
Post #10





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 19.01.2007

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
nevt
post 27.11.2007, 19:37:21
Post #11





Grupa: Przyjaciele php.pl
Postów: 1 595
Pomógł: 282
Dołączył: 24.09.2007
Skąd: Reda, Pomorskie.

Ostrzeżenie: (0%)
-----


wystarczy drobna zmiana w drugim replace:
  1. <?php
  2. $text1 = preg_replace('/href="(/?)(.*?)"/', 'href="http://podmien.pl/${2}"', $text1);
  3. ?>


--------------------

-
Oh no, my young coder. You will find that it is you who are mistaken, about a great many things... -
Go to the top of the page
+Quote Post
reegen
post 27.11.2007, 19:48:06
Post #12





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 19.01.2007

Ostrzeżenie: (0%)
-----


(\/?) 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:)

Ten post edytował reegen 27.11.2007, 19:50:16
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 10:06