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

È stato utile?

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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top