2011-11-29 56 views
10

Biểu thức chính quy tốt nhất cho trường hợp này là gì?Khớp đường dẫn của URL, trừ phần mở rộng tên tệp

Với URL này:

http://php.net/manual/en/function.preg-match.php 

Làm thế nào tôi nên đi về việc chọn lựa tất cả mọi thứ giữa (nhưng không bao gồm) http://php.net.php:

/manual/en/function.preg-match 

này là dành cho một tập tin cấu hình Nginx.

+0

'(?: Http: [\ /] {2}. +? [.]) [^ \ /] + (. +) [.] +. +' – gaussblurinc

Trả lời

7

Như thế này:

if (preg_match('/(?<=net).*(?=\.php)/', $subject, $regs)) { 
    $result = $regs[0]; 
} 

Giải thích:

" 
(?<=  # Assert that the regex below can be matched, with the match ending at this position (positive lookbehind) 
    net  # Match the characters “net” literally 
) 
.   # Match any single character that is not a line break character 
    *   # Between zero and unlimited times, as many times as possible, giving back as needed (greedy) 
(?=  # Assert that the regex below can be matched, starting at this position (positive lookahead) 
    \.  # Match the character “.” literally 
    php  # Match the characters “php” literally 
) 
" 
+0

Cảm ơn FailedDev đã giải thích chi tiết, hoạt động hoàn hảo – silkAdmin

+3

''/ net (. *) \. Php /'', phiên bản đơn giản hơn, ngắn hơn (và có thể hoạt động tốt hơn) của cùng một biểu thức. (Tôi thích những biểu hiện không có những cách nhìn không cần thiết.) – Qtax

2

Hãy thử điều này:

preg_match("/net(.*)\.php$/","http://php.net/manual/en/function.preg-match.php", $matches); 
echo $matches[1]; 
// prints /manual/en/function.preg-match 
0

trận đấu URL chung này cho phép bạn chọn các phần của một URL:

if (preg_match('/\\b(?P<protocol>https?|ftp):\/\/(?P<domain>[-A-Z0-9.]+)(?P<file>\/[-A-Z0-9+&@#\/%=~_|!:,.;]*)?(?P<parameters>\\?[-A-Z0-9+&@#\/%=~_|!:,.;]*)?/i', $subject, $regs)) { 
    $result = $regs['file']; 
    //or you can append the $regs['parameters'] too 
} else { 
    $result = ""; 
} 
19

Cụm từ thông dụng có thể không phải là công cụ hiệu quả nhất cho công việc này.

Hãy thử sử dụng parse_url(), kết hợp với pathinfo():

$url  = 'http://php.net/manual/en/function.preg-match.php'; 
$path  = parse_url($url, PHP_URL_PATH); 
$pathinfo = pathinfo($path); 

echo $pathinfo['dirname'], '/', $pathinfo['filename']; 

Các đầu ra mã trên:

/manual/en/function.preg-match
+0

Cảm ơn phoenix, nó cũng hoạt động, nhưng tôi đang tìm một giải pháp cũ cho việc này. – silkAdmin

+1

@silkAdmin Điều đó thật kỳ lạ; tại sao giải pháp phải là một biểu thức chính quy? –

+1

Xin lỗi tôi không nên sử dụng thẻ PHP đã gây nhầm lẫn, tôi cần regex cho tệp cấu hình Nginx nơi giải pháp của bạn không phải là tùy chọn – silkAdmin

-1

biểu hiện thường xuyên cho phù hợp với tất cả mọi thứ sau khi "net" và trước ".php":

$pattern = "net([a-zA-Z0-9_]*)\.php"; 

Trong biểu thức chính quy ở trên, bạn có thể tìm thấy nhóm ký tự phù hợp kèm theo "()" là những gì bạn đang tìm kiếm.

Hy vọng nó hữu ích.

+2

Điều đó sẽ không khớp với ví dụ đã cho, bởi vì có một dấu chấm trong đó: 'function.preg-match' – Toto

+0

Chưa kể nó cũng không khớp với dấu gạch chéo. Ngoài ra, regexp không được neo - mà có thể sẽ không gây ra vấn đề (toán tử '*' tham lam theo mặc định), nhưng nó không phải là một thực hành tốt. –

2

Không cần sử dụng cụm từ thông dụng để phân tách URL. PHP có các hàm dựng sẵn cho điều này, pathinfo()parse_url().

0

Dưới đây là một giải pháp regex tốt hơn so với những gì hầu hết đã cung cấp cho đến nay, nếu bạn hỏi tôi: http://regex101.com/r/nQ8rH5

 
/http:\/\/[^\/]+\K.*(?=\.[^.]+$)/i 
0

đơn giản:

$url = "http://php.net/manual/en/function.preg-match.php"; 
preg_match("/http:\/\/php\.net(.+)\.php/", $url, $matches); 
echo $matches[1]; 

$matches[0] là URL đầy đủ của bạn, $matches[1] là phần bạn muốn.

Xem mình: http://codepad.viper-7.com/hHmwI2

1

Chỉ cần cho những niềm vui của nó, đây là hai cách mà chưa được khám phá:

substr($url, strpos($s, '/', 8), -4) 

Hoặc:

substr($s, strpos($s, '/', 8), -strlen($s) + strrpos($s, '.')) 

Dựa trên ý tưởng rằng Lược đồ HTTP http://https:// có tối đa 8 ký tự, vì vậy thường nó đủ để tìm dấu gạch chéo đầu tiên từ vị trí thứ 9 trở đi. Nếu tiện ích mở rộng luôn là .php mã đầu tiên sẽ hoạt động, nếu không, mã còn lại là bắt buộc.

Đối với một giải pháp biểu thức chính quy tinh khiết bạn có thể phá vỡ các chuỗi xuống như thế này:

~^(?:[^:/?#]+:)?(?://[^/?#]*)?([^?#]*)~ 
          ^

Các phần đường dẫn sẽ là bên trong nhóm bộ nhớ đầu tiên (tức là chỉ số 1), chỉ định bởi các ^ trong dòng bên dưới cách diễn đạt. Loại bỏ phần mở rộng có thể được thực hiện bằng pathinfo():

$parts = pathinfo($matches[1]); 
echo $parts['dirname'] . '/' . $parts['filename']; 

Bạn cũng có thể tinh chỉnh các biểu hiện sau:

([^?#]*?)(?:\.[^?#]*)?(?:\?|$) 

biểu hiện này không phải là rất tối ưu mặc dù, bởi vì nó có một số trở lại theo dõi trong đó. Cuối cùng tôi sẽ đi kiếm cái gì ít tùy chỉnh:

$parts = pathinfo(parse_url($url, PHP_URL_PATH)); 
echo $parts['dirname'] . '/' . $parts['filename']; 
0

| (? < = \ w) /.+ (?. = \ \ W + $) |

  • chọn tất cả mọi thứ từ đầu đen '/' trước bởi
  • nhìn đằng sau một Word (\ w) nhân vật
  • đến tiếp theo là một cái nhìn về phía trước
    • đen '' nối bởi
    • một hoặc nhiều Word (\ w) ký tự
    • trước khi kết thúc $
 
    re> |(?<=\w)/.+(?=\.\w+$)| 
Compile time 0.0011 milliseconds 
Memory allocation (code space): 32 
    Study time 0.0002 milliseconds 
Capturing subpattern count = 0 
No options 
First char = '/' 
No need char 
Max lookbehind = 1 
Subject length lower bound = 2 
No set of starting bytes 
data> http://php.net/manual/en/function.preg-match.php 
Execute time 0.0007 milliseconds 
0: /manual/en/function.preg-match 

|. // [^ /] * (. *) \ \ w + $ |

  • tìm thấy hai nghĩa đen '//' tiếp theo bất cứ điều gì nhưng một chữ '/'
  • chọn tất cả mọi thứ cho đến khi
  • tìm đen '' tiếp theo chỉ Word \ w nhân vật trước khi kết thúc $
 
    re> |//[^/]*(.*)\.\w+$| 
Compile time 0.0010 milliseconds 
Memory allocation (code space): 28 
    Study time 0.0002 milliseconds 
Capturing subpattern count = 1 
No options 
First char = '/' 
Need char = '.' 
Subject length lower bound = 4 
No set of starting bytes 
data> http://php.net/manual/en/function.preg-match.php 
Execute time 0.0005 milliseconds 
0: //php.net/manual/en/function.preg-match.php 
1: /manual/en/function.preg-match 

|/[^ /] + (. *) \.|

  • tìm đen '/' tiếp theo ít nhất 1 hoặc không hơn đen '/'
  • hung hăng chọn tất cả mọi thứ trước khi cuối cùng đen ''
 
    re> |/[^/]+(.*)\.| 
Compile time 0.0008 milliseconds 
Memory allocation (code space): 23 
    Study time 0.0002 milliseconds 
Capturing subpattern count = 1 
No options 
First char = '/' 
Need char = '.' 
Subject length lower bound = 3 
No set of starting bytes 
data> http://php.net/manual/en/function.preg-match.php 
Execute time 0.0005 milliseconds 
0: /php.net/manual/en/function.preg-match. 
1: /manual/en/function.preg-match 

|/[^ /] + \ K * (= \?.). |

  • tìm đen '/' tiếp theo ít nhất 1 hoặc nhiều phi đen '/'
  • Đặt lại chọn start \ K
  • hung hăng chọn tất cả mọi thứ trước khi
  • nhìn về phía trước cuối cùng đen ''
 
    re> |/[^/]+\K.*(?=\.)| 
Compile time 0.0009 milliseconds 
Memory allocation (code space): 22 
    Study time 0.0002 milliseconds 
Capturing subpattern count = 0 
No options 
First char = '/' 
No need char 
Subject length lower bound = 2 
No set of starting bytes 
data> http://php.net/manual/en/function.preg-match.php 
Execute time 0.0005 milliseconds 
0: /manual/en/function.preg-match 

| \ w + \ K /.* (= \?.) |

  • tìm một hoặc nhiều Word (\ w) ký tự trước một chữ '/'
  • reset chọn bắt đầu \ K
  • chọn đen '/' tiếp theo
  • bất cứ điều gì trước khi
  • nhìn về phía trước chữ cuối cùng '.'
 
    re> |\w+\K/.*(?=\.)| 
Compile time 0.0009 milliseconds 
Memory allocation (code space): 22 
    Study time 0.0003 milliseconds 
Capturing subpattern count = 0 
No options 
No first char 
Need char = '/' 
Subject length lower bound = 2 
Starting byte set: 0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P 
    Q R S T U V W X Y Z _ a b c d e f g h i j k l m n o p q r s t u v w x y z 
data> http://php.net/manual/en/function.preg-match.php 
Execute time 0.0011 milliseconds 
0: /manual/en/function.preg-match 
-1

http:[\/]{2}.+?[.][^\/]+(.+)[.].+

chúng ta hãy xem, những gì nó thực hiện:

http:[\/]{2}.+?[.][^\/] - tổ chức phi chụp cho http://php.net

(.+)[.] - chụp một phần cho đến khi chấm cuối cùng xảy ra: /manual/en/function.preg-match

[.].+ - phần mở rộng phù hợp của tệp như sau: .php

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