Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: preg zero powtórzeń
Forum PHP.pl > Forum > PHP
DarK MaN
Witam.Potrzebuje wyrażenie które doda do linka adres ale tylko jeśli link nie zaczyna się na http.
Napisałem coś takiego ale jak można się domyślać nie działa winksmiley.jpg

  1. <?php
  2. $buttons1 = '<a href="http://jakis_host.pl/folder/plik.htm" target="_blank">';
  3. //$buttons2 = '<a href="/folder/plik.htm" target="_blank">';
  4.  
  5.  
  6. $url = "http://jakis_host.pl";
  7. $pattern = '@href="(?:[^h]?[^t]?[^t]?[^p]?)@';
  8. $pattern2 = '@href="(?:http){0}@';
  9. $replacement = 'href="'.$url;
  10.  
  11. $buttons = preg_replace($pattern1,$replacement1,$buttons);
  12.  
  13. echo($buttons);
  14. ?>


W pierwszym przypadku ($button1) nie powinno dodać url natomiast w drugim ($button2) url już powinien być dodany. Napisałem dwa wzory ($pattern1 i $pattern2) ale żaden z nich nie działa poprawnie. Macie może jakiś pomysł jak napisać takie wyrażenie?
missile
Trzeci parametr funkcji preg_replace jest zmienną zawierającą ciąg do sprawdzenia. W Twoim przypadku jest to $buttons do której nie przypisujesz żadnej wartości...
DarK MaN
Ten błąd wynikł akurat przy przepisywaniu kodu na forum alby był czytelniejszy. Nie zmienia to jednak faktu ze wzorce nie działają. Niżej zamieszczam poprawiony kod
  1. <?php
  2. $buttons1 = '<a href="http://jakis_host.pl/folder/plik.htm" target="_blank">';
  3. //$buttons2 = '<a href="/folder/plik.htm" target="_blank">';
  4.  
  5.  
  6. $url = "http://jakis_host.pl";
  7. $pattern1 = '@href="(?:[^h]?[^t]?[^t]?[^p]?)@';
  8. $pattern2 = '@href="(?:http){0}@';
  9. $replacement1 = 'href="'.$url;
  10.  
  11. $buttons = preg_replace($pattern1,$replacement1,$buttons1);
  12.  
  13. echo($buttons);
  14. ?>
bendi
look behind assertions (niestety nie znam tłumaczenia)
  1. <?php
  2. $s = '<a href="/folder/plik.htm" target="_blank">';
  3. $sRegExp = '#href=("|')(?<!http://)(.*?)1#';
  4. $sUrl = "http://jakis_host.pl";
  5.  
  6. echo preg_replace( $sRegExp, 'href=1' . $sUrl . '21', $s );
  7.  
  8.  
  9. ?>
jarrod
jakoś powyższe funkcje nieprawidłowo reagują kiedy w linku już jest http...

Wyrażenie
  1. <?php
  2. $pattern1 = '@href="(?:[^h]?[^t]?[^t]?[^p]?)@';
  3. ?>

jest raczej pomyłką. No chyba że link np: "cos/http/folder/plik.htm" nie może się zdarzyć.

eregi" title="Zobacz w manualu php" target="_manual to bardzo fajna funkcja którą można sprawdzić czy jakiś string występuje w innym stringu.
Jeżeli nie to podejmujesz odpowiednie działanie.

  1. <?php
  2. $buttons = '<a href="cos/http/folder/plik.htm" target="_blank">';
  3. if(!eregi('http://',$buttons))
  4. {
  5. $pa = '/href="/';
  6. $re = 'href="http://jakis_host.pl/';
  7. $buttons = preg_replace($pa,$re,$buttons);
  8. }
  9. ?>

Oczywiście "htmlspecialchars" jest tu tylko po to aby kod ładnie się pokazał w przeglądarce winksmiley.jpg
DarK MaN
Cytat(DarK MaN @ 18.10.2006, 15:04:14 ) *
Ten błąd wynikł akurat przy przepisywaniu kodu na forum alby był czytelniejszy. Nie zmienia to jednak faktu ze wzorce nie działają. Niżej zamieszczam poprawiony kod
  1. <?php
  2. $buttons1 = '<a href="http://jakis_host.pl/folder/plik.htm" target="_blank">';
  3. //$buttons2 = '<a href="/folder/plik.htm" target="_blank">';
  4. $url = "http://jakis_host.pl";
  5. $pattern1 = '@href="(?:[^h]?[^t]?[^t]?[^p]?)@';
  6. $pattern2 = '@href="(?:http){0}@';
  7. $replacement1 = 'href="'.$url;
  8.  
  9. $buttons = preg_replace($pattern1,$replacement1,$buttons1);
  10.  
  11. echo($buttons);
  12. ?>

NIe działa

Jeśli chodzi o eregi to nie pasuje mi bo jeśli mam dokument html i w nim różne rodzaje linków (te z http i bez) to nie bardzo mnie ta funkcja ratuje.

Macie jeszcze jakiś pomysł w jaki sposób zanegować wyrażenie w regularne?
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.