2010-10-11 27 views
9

Tôi muốn khớp một liên kết url trong bài đăng trên tường và thay thế liên kết này bằng thẻ neo, vì điều này tôi sử dụng biểu thức chính quy bên dưới.mẫu url đối sánh trong php sử dụng cụm từ thông dụng

Tôi muốn thi đấu 4 loại url:

  1. http://example.com
  2. https://example.com
  3. www.example.com
  4. example.com
preg_replace('@(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?)@', 
      '<a href="$1">$1</a>', $subject); 

Biểu thức này chỉ khớp với hai loại url đầu tiên.

Nếu tôi sử dụng cụm từ này cho mẫu url đối sánh '@(www?([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?)@', thì chỉ khớp với loại mẫu url thứ ba.

Làm cách nào tôi có thể đối sánh tất cả bốn loại mẫu url với một cụm từ thông dụng duy nhất?

Trả lời

14

Tôi muốn sử dụng một chính sách khác. Như thế này mà Gruber posted năm 2009:

\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/))) 

hoặc phiên bản cập nhật này mà Gruber posted trong năm 2010 (nhờ, @IMSoP):

(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’])) 
+2

Lưu ý rằng có một phiên bản mới hơn của regex mà ở đây: http://daringfireball.net/2010/ 07/improved_regex_for_matching_urls – IMSoP

+2

Được thực hiện bằng PHP: [http://stackoverflow.com/a/10002262/1055533](http://stackoverflow.com/a/10002262/1055533) – Oskar

0

Nếu bạn muốn chắc rằng một công việc bạn cần phải làm cho phần "https? //" tùy chọn, vì bạn dường như có một nắm bắt khá tốt về regexps Tôi sẽ không hiển thị cho bạn, một đoạn trích cho người đọc :)

Nhưng tôi thường đồng ý với Nev, nó quá phức tạp cho những gì nó làm.

14

Một ví dụ làm việc hoàn toàn sử dụng Nev Stokes đưa link:

public function clickableUrls($html){ 
    return $result = preg_replace(
     '%\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))%s', 
     '<a href="$1">$1</a>', 
     $html 
    ); 
} 
+0

lòng tốt của tôi, cuối cùng tác phẩm này hoạt động ... Tôi đã thử tất cả các loại mà mọi người đã đăng, hoặc gặp rắc rối với cú pháp hoặc họ làm việc một phần (những gì tôi cần sửa chữa là thứ đó ere là khoảng thời gian ở cuối url đã được chọn, như t.co/123213 ...) – kn00tcn

+0

Đúng, hoạt động tuyệt vời! – Ben

1

tôi chỉ kiểm tra bài đăng này (sau 2 năm) có thể là bạn có câu trả lời nhưng đối với những người mới bắt đầu, bạn có thể sử dụng thường xuyên biểu thức để loại bỏ mọi loại URL hoặc Chuỗi truy vấn

(https|http|ftp)\:\/\/|([a-z0-9A-Z]+\.[a-z0-9A-Z]+\.[a-zA-Z]{2,4})|([a-z0-9A-Z]+\.[a-zA-Z]{2,4})|\?([a-zA-Z0-9]+[\&\=\#a-z]+) 

nó sẽ loại bỏ mọi loại URL, hãy xem danh sách sau đây. Tôi sử dụng loại khác nhau của lĩnh vực cho những ai muốn hỏi "nó sẽ tước .us, .in hoặc .pk vv loại lĩnh vực hay không.

  1. ftp://www.web.com
  2. web.net
  3. www.website .info
  4. website.us
  5. web.ws?query=true
  6. www.web.biz?query=true
  7. ftp://web.in?query=true
  8. media.google.com
  9. ns.google.pk
  10. ww1.smart.au
  11. www3.smart.br
  12. w1.smart.so
  13. ? ques == hai & t = p
  14. http://website.info?ques==two&t=p
  15. https://www.weborwebsite.com

làm việc Ví dụ (thử nghiệm trong PHP5 +, Apache2 +):

$str = "ftp://www.web.com, web.net, www.website.info, website.us, web.ws?query=true, www.web.biz?query=true, ftp://web.in?query=true, media.google.com hello world, working more with ns ns.google.pk or ww1.smart.au and www3.smart.br w1.smart.so ?ques==two&t=p http://website.info?ques==two&t=p https://www.weborwebsite.com and ftp://www.hotmail.br"; 
echo preg_replace("/(https|http|ftp)\:\/\/|([a-z0-9A-Z]+\.[a-z0-9A-Z]+\.[a-zA-Z]{2,4})|([a-z0-9A-Z]+\.[a-zA-Z]{2,4})|\?([a-zA-Z0-9]+[\&\=\#a-z]+)/i", "", $str); 

nó sẽ trở lại

, , , , , , , hello world, working more with ns or and and 

Hy vọng nó sẽ giúp rất nhiều trong lập trình ra có

2

Tôi nhìn quanh và không thấy bất kỳ được chính xác những gì tôi cần. Tôi thấy this one đó là chặt chẽ, vì vậy tôi sửa đổi nó như sau:

^((([hH][tT][tT][pP][sS]?)\:\/\/)?([\w\\-]+(\[\w\.\&%\$\-]+)*)?((([^\s\(\)\<\>\\\"\.\ [\]\,;:]+)(\.[^\s\(\)\<\>\\\"\.\[\]\,;:]+)*(\.[a-zA-Z]{2,4}))|((([01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}([01]?\d{1,2}|2[0-4]\d|25[0-5])))(\b\:(6553[0-5]|655[0-2]\d|65[0-4]\d{2}|6[0-4]\d{3}|[1-5]\d{4}|[1-9]\d{0,3}|0)\b)?((\/[^\/][\w\.\,\?\'\\\/\+&%\$#\=~_\-]*)*[^\.\,\?\"\'\(\)\[\]!;<>{}\s\x7F-\xFF])?)$ 

check it out trên debuggex.

0

sử dụng mẫu này.

$regex = "(https?\:\/\/|ftp\:\/\/|www\.|[a-z0-9-]+)+([a-z0-9-]+)\.+([a-z]{2,4})((\/|\.)+([a-z0-9-_.\/]*)$|$)"; 

hy vọng hữu ích.

0

hai xu của tôi (năm sau!):

preg_match("/^((https|http|ftp)\:\/\/)?([a-z0-9A-Z]+\.[a-z0-9A-Z]+\.[a-z0-9A-Z]+\.[a-zA-Z]{2,4}|[a-z0-9A-Z]+\.[a-z0-9A-Z]+\.[a-zA-Z]{2,4}|[a-z0-9A-Z]+\.[a-zA-Z]{2,4})$/i", $url) 

Hy vọng nó sẽ giúp người

Các vấn đề liên quan