Sto utilizzando un'espressione regolare per trovare qualsiasi URL e collegarli di conseguenza. Tuttavia, non voglio collegare alcun URL già collegato, quindi sto usando lookbehind per vedere se l'URL ha un href prima di esso. Questo fallisce perché i quantificatori di lunghezza variabile non sono consentiti in lookahead e lookbehind per PHP.quantificatori negativi di lookbehind e greedy in php
Ecco l'espressione regolare per la partita:
/\b(?<!href\s*=\s*[\'\"])((?:http:\/\/|www\.)\S*?)(?=\s|$)/i
Qual è il miglior modo per aggirare questo problema?
EDIT:
devo ancora testarlo, ma penso che il trucco per farlo in un unico regex sta usando espressioni condizionali all'interno della regex, che è supportato da PCRE. Sembrerebbe qualcosa di simile:
/(href\s*=\s*[\'\"])?(?(1)^|)((?:http:\/\/|www\.)\w[\w\d\.\/]*)(?=\s|$)/i
Il punto chiave è che se il href viene catturato, la partita è subito buttato fuori a causa della condizionale (?(1)^|)
, che è garantito per non corrispondono. Probabilmente c'è qualcosa di sbagliato in questo. Lo proverò domani.
Um, utilizzare un parser HTML e collegare solo quando si tratta di un nodo di testo? – kennytm
Questa è probabilmente la soluzione migliore. Ero più curioso di vedere se c'era un modo per regolare la regex però. –
+1 bella domanda. – NikiC