Bir URL regex Eşleştirme tire

1 Cevap php

Ben metinden adresler almak için aşağıdaki regex kullandık (örneğin "this is text http://url.com/blabla possibly some more text").

'@(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?)@'

Bu, tüm URL'ler için çalışır ama sadece gibi kısaltılmış URL'ler için çalışmıyor öğrendim: maçtan sonra "blabla bla http://ff.im/-bEnA blabla" olur http://ff.im/.

Ben bu çizgi ile ilgisi var sanıyorum - bölü sonra /.

1 Cevap

Kısa cevap: [\w/_\.] maç - bu yüzden yapmaz [-\w/_\.]

Uzun cevap:

@              - delimiter
(              - start of group
    https?://  - http:// or https://
    ([-\w.]+)+ - capture 1 or more hyphens, word characters or dots, 1 or more times.. this seems odd - don't know what the second + is for
    (:\d+)?    - optionally capture a : and some numbers (the port)
    (          - start of group
    	/            - leading slash
    	(            - start of group
    		[\w/_\.] - any word character, underscore or dot - you need to add hyphen to this list or just make it [^?\S] - any char except ? or whitespace (the path + filename)
    	    (\?\S+)? - optionally capture a ? followed by anything except whitespace (the querystring)
    	)?     - close group, make it optional
    )?         - close group, make it optional
)              - close group
@