Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Podmiana ciągu
Forum PHP.pl > Forum > Przedszkole
Tomash29
Witam

Od jakiegoś czasu staram sie wykonać skrypt, który pobierał by część kodu z innej strony, przekształcał go i umieszczał na mojej stronie.
Sprawa niby prosta, ale utknąłem na jednej żeczy.
Ciag znaków, przed podmianą, wyglada np. tak:

href="http://33.333.333.33/$%@AAAA

a po podmianie:

href="http://444.44.44.444/#^%#$#DFER/AAAABBBB

Nie wiem jakiej funcji użyć, żeby wstawić ciąg znaków na końcu (tytaj oznaczony jako BBBB)
Część oznaczona jako AAAA jast stała dla obu ciągów i składa się od jednego do czterech znaków.

Wiem jak doprowadzić wszystko do momentu:

href="http://444.44.44.444/#^%#$#DFER/AAAA

i poprawnie wyświetlić na mojej stronie.

Z góry dziękuję za każdą pomoc.
czychacz
$string .= 'BBBBBBBBBBBBBB'?
jeśli nie o to chodziło, to wytłumacz jeszcze raz
Tomash29
Opisze dokładniej:

Mam:

http://12.345.678.900/?161
http://12.345.678.900/?22
http://12.345.678.900/?3

A chcę otzymać:

http://192.168.44.569/user/nolan/161&run
http://192.168.44.569/user/nolan/22&run
http://192.168.44.569/user/nolan/3&run

Udało mi się uzyskac:

http://192.168.44.569/user/nolan/161
http://192.168.44.569/user/nolan/22
http://192.168.44.569/user/nolan/3

Nie potrafię dodać końcówki, w tym przykładzie &run
Kombinuję z str_replace:

$content = str_replace('http://192.168.44.569/user/nolan/+([0-9]{1,3})', 'http://192.168.44.569/user/nolan/+([0-9]{1,3})&run', $content);

Ale coś robię nie tak...

Pozdrawaim
b4rt3kk
  1. $string = 'http://192.168.44.569/user/nolan/161'; // jak już masz ciąg taki pod jakąś zmienną
  2. $string .= '&run'; // dodaj tylko tak
  3. echo $string;
Tomash29
Tylko że tych ciągów mam ponad 1000...

http://192.168.44.569/user/nolan/1
http://192.168.44.569/user/nolan/...
http://192.168.44.569/user/nolan/1150

I dla każdego trzeba napisać działanie oddzielnie??
b4rt3kk
Nie mam pojęcia, bo nie wiem jak to robisz, ale myślę, że nie trzeba dla każdego oddzielnie, pokaż kod.
abort
Czy zawsze jest tak, że:
- w źródle jest http://12.345.678.900/?161 (zawsze ten sam IP i jedna liczba po pytajniku)
- chcesz uzyskać inny http://192.168.44.569/user/nolan/161&run - czyli: inny adres IP i tę samą liczbę co była w źródle (poprzedzoną pewnym tekstem i doklejonym innym tekstem)

Jeśli tak (bo tak zrozumiałem Twój problem), to powinno zadziałać:
  1. <?php
  2.  
  3. $from = array (
  4. 'http://12.345.678.900/?161',
  5. 'http://12.345.678.900/?22',
  6. 'http://12.345.678.900/?3'
  7. );
  8.  
  9. foreach ($from as $url) {
  10. $new = preg_replace ('#12.345.678.900#', '192.168.44.569', $url);
  11. $cel = preg_replace ('#(.*)/\?(\d+)$#', '\\1/user/nolan/\\2&run', $new);
  12. echo $cel . '<br>';
  13.  
  14. }
  15. ?>

To co chciałeś, rozbiłem na dwa preg_replace, nie chce mi się myśleć nad zrobieniem tego w jednej instrukcji, choć oczywiście nie jest to trudne. Swoją drogą, byłeś na dobrej drodze smile.gif
Tomash29
Dzięki, o to chodziło :-)

Teraz kombinuję jak wyciągnąć dane ze strony. Ponieważ te linki:

http://12.345.678.900/?161
http://12.345.678.900/?...
http://12.345.678.900/?3

znajdują się w kodzie strony *.php wraz z innymi danymi.
Wymyśliłem coś takiego:

<?php
// Pobieranie zawartości <a>

$content = file_get_contents('http://xx.xxx.xxx.xxx/strona.php');

preg_match_all('/<a.*href=\"http:\/\/12.345.678.900\/?(\d{1,3})<\/a>/', $content, $links);

$from = array ($links);

foreach ($links as $url) {

//$new = preg_replace ('#12.345.678.900#', '192.168.44.569', $url);
//$cel = preg_replace ('#(.*)/\?(\d{1,3})#', '\\1/user/nolan\\2&run', $new);

echo $cel . '<br>';

}

?>

Ale albo coś źle wpisuję, albo idę w złym kierunku...
Jedyne co wyświetla mi się na stronie to "Array"
Może jest na to lepszy sposób??
abort
Ale po co dajesz kod $from = array ($links); ?
$links o już jest tablica, instrukcja preg_match_all o to zadbała smile.gif
Poza tym, zrób sobie print_r ($tablica) i zobacz, co w niej jest.
Tomash29
OK

to mam:

preg_match_all('#<a(.*)</a>#s', $content, $links);

i po wbiciu:

print_r($links);

wyświetla:

<a href='http://12.345.678.900/?292'>(xxx) xxx xxx xxxx xxr</a> <a href='http://12.345.678.900/?298'>(xxx) xxx xxx xxxx xxr</a><br> <a href='http://12.345.678.900/?456'>(xxx) xxx xxx xxxx xxr</a><br> <a href='http://12.345.678.900/?225'>(xxx) xxx xxx xxxx xxr</a><br> <a href='http://12.345.678.900/?456'>(xxx) xxx xxx xxxx xxr</a><br> <a href='http://12.345.678.900/?548'>(xxx) xxx xxx xxxx xxr</a><br>

Więc prawidłowo. Niestety po zastosowaniu:

$new = preg_replace ('#12.345.678.900#', '192.168.44.569', $links);
$cel = preg_replace ('#(.*)/\?(\d+)$#', '\\1/user/nolan/\\2&run', $new);

Wyświetla:

Array ( [0] => Array [1] => Array )

lub:

Array

jak próbuje odczytać dane z tabeli 1 lub 0...





abort
Awidzisz... Ty to masz w jednej linii, moje wyrażenie ma w sobie "$" - ma sprawdzać do końca linii. Jak miałem wyniki w tablicy, wszystko było OK. Po prostu nie wiedziałem, w jakiej postaci mam się spodziewać danych, a to zależy od zawartości pliku - więc się skupiłem na wyrażeniu regularnym.

Ty musisz zrobić jeszcze dwie rzeczy:
1. przed pętlą foreach dodać:
  1. $from = preg_match_all ("#<a href=.*?</a>#", $links, $matches);

Zakładam, że $links to jest ta zmienna, którą wypluwasz na ekran przez print_r - rozbite odnośniki masz w tablicy $matches, ale jak sobie ją rozbijesz, to z ciekawości sobie ją wyświetl, bo to jest tablica tablic (tak, takie coś) smile.gif

2. Musisz do foreach przekazać tablicę z odnośnikami, którą rozbiłeś w punkcie 1:
  1. foreach ($matches[0] as $url) { // i dalej to, co napisałem we wcześniejszym poście.

Jeżeli zrobisz sobie wcześniej print_r ($matches), to będziesz wiedział, dlaczego tak trzeba to zapisać.

W ogóle, print_r i var_dump Teoimi przyjaciółmi... smile.gif
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.