Sostituire collegamenti locali, Tenere Collegamenti esterni
-
06-09-2019 - |
Domanda
Ho una chiamata API che restituisce essenzialmente il codice HTML di una pagina wiki applicazione ospitata. Sto quindi facendo qualche substr, str_replace e preg_replace kung-fu di formattarlo come per le mie guide siti di stile.
Faccio una serie di chiamate a formattare il mio navigazione a sinistra (la modifica di un link per pageX al mio wikiParse? Page = pageX tipo di cosa). Posso tranquillamente fare questo sulla navigazione a sinistra. Nel corpo del testo, però, non posso avere la certezza di un link è un link ad una pagina interna. Potrebbe benissimo essere un link ad una risorsa esterna. Così ho bisogno di fare un preg_replace che corrisponde href = che non è seguita da http: //.
Ecco il mio pugnalata a lui:
$result = preg_replace('href\=\"(?!http\:\/\/)','href="bla?id=',$result);
Questo sembra mettere a nudo fuori l'intero contenuto della pagina. Chiunque vedere dove sono scivolato in su? Io non credo di essere troppo lontano, basta non può vedere dove andare prossimo.
Saluti
Soluzione
Le funzioni preg_*
aspettano noreferrer Perl Compatible Regular Expressions (PCRE) . La differenza strutturale normali espressioni regolari è che l'espressione si è avvolto in delimitatori che separano l'espressione da possibili modificatori . Il delimitatore classico è la /
ma PHP permette a qualsiasi altro carattere non alfanumerico tranne il carattere di backslash. Vedi anche IntruductionStoriaServizioIl a PCRE in PHP .
Quindi, provate questo:
$result = preg_replace('/href="(?!http:\/\/)/', 'href="bla?id=', $result);
Ecco href="(?!http://)
è l'espressione regolare. Ma come si usa /
come delimitatori, le occorrenze di /
all'interno dell'espressione regolare devono essere sfuggito utilizzando backslash.
Altri suggerimenti
Il tuo regexp manca di inizio e fine delimitatori (di default '/');
$result = preg_replace('/href\=\"(?!http\:\/\/)/','href="bla?id=',$result);