Discussione

PHP | come riconoscere gli URL in una stringa e attivarne il collegamento

PHP | come riconoscere gli URL in una stringa e attivarne il collegamento

Durante un lavoro per un cliente ho avuto la necessità di far riconoscere al PHP gli URL digitati dagli utenti all'interno di un area di testo, per poterne attivare i collegamenti. Avrei dovuto consentire all'utente di scrivere uno o più URL all'interno di un testo, salvarlo nel database mysql e fare in modo che lo stesso testo, in fase di lettura avesse gli URL attivi, così che fosse possibile cliccare su un URL e raggiungere la risorsa collegata. Ora, se chiedete a Google questo genere di cose specificando PHP, molto probabilmente vi imbatterete in preg_match, preg_match_all, preg_replace_callback. Vi ritroverete ad utilizzare cose di questo tipo: $pattern = '/(\d*)-(\d*)/'; Questo era un esempio molto semplice, ne ho trovati alcuni che facevano paura... Quello che otterrete adottando questo approccio sarà un buon riconoscimento dei link nel testo, ma con un effetto collaterale: verrà considerata come collegamento qualsiasi stringa contente un punto, per esempio pinco.pallino sarà considerato un link. Quando mi sono stufato di setacciare tutti i forum di programmazione, dove a quanto pare su questo tema si brancola nel buio, ho creato uno script PHP in grado di riconoscere gli URL controllando la parte iniziale che può essere: 1 - http 2 - https 3 - www Dopo che lo script identifica una di queste tre stringhe appena elencate, conta uno per uno i caratteri dell'url fino allo spazio oppure al ritorno a capo, oppure alla fine del testo. Incollo lo script qui di seguito a vostra disposizione. $len=strlen($str); $end = 0; $q= 0; $trovato= ""; do{ $q = $q+1; for($i=$end;$i<$len;$i++){ if ($str[$i]== 'h' && $str[$i+1]== 't' && $str[$i+2]== 't'&& $str[$i+3]== 'p' ){$start = $i;$trovato = " http";break;} if ($str[$i]!= '/' && $str[$i+1]== 'w' && $str[$i+2]== 'w'&& $str[$i+3]== 'w' && $str[$i+4]== '.' ){$start = $i+1;$trovato = "www";break;} } if($trovato == " http"){ for($i=$start;$i<=$len;$i++){ if ($str[$i] == " " || $str[$i] == "\n" || $i == $len){$end = $i;break;} } for($y=$start;$y<=$end;$y++){ $linkare[$q] = $linkare[$q].$str[$y]; } } if($trovato == "www"){ for($i=$start;$i<=$len;$i++){ if ( $str[$i] == " " || $str[$i] == "\n" || $i == $len){$end = $i;break;} } for($y=$start;$y<=$end;$y++){ $linkare[$q] = $linkare[$q].$str[$y]; } $linkare[$q] = str_replace(' www.','https://www.',$linkare[$q]); $linkare_flag[$q]="w"; } $trovato = ""; }while ($linkare[$q-1] !== $linkare[$q]); $q=$q-1; // sostituisce tutti i link con l HREF // ES. str_replace(cerca, sostituisci ,dove_cercare) for($q2=1;$q2<=$q;$q2++){ if($linkare_flag[$q2]=="w"){ $lin=str_replace(' https://www.','www.',$linkare[$q2]); $variabile= " > https://$lin> $lin "; $str = str_replace($lin,$variabile, $str); }else{ $lin=$linkare[$q2]; $variabile= " $lin "; $str = str_replace($lin,$variabile, $str); } } Spero che il mio articolo vi sia stato utile. Fatemi sapere che cosa ne pensate nei commenti.