2013-08-01 20 views
5

kiến ​​thức regex của tôi là thoát tôi trên này ...Regex để phù hợp với ampersands trong một URI được tiếp theo là một bằng và không khác dấu và

Nói rằng tôi có một URL với một URI như một tham số truy vấn, ala :

http://hostname.com?uri=http://website.com/company/YoYo+&+Co+Inc&type=company 

... giả param uri của chúng tôi không chứa bất kỳ params bản thân, tôi muốn tự phân tích ra các params truy vấn trong Javascript, nhưng rõ ràng các dấu trong param uri nhúng của chúng tôi làm cho nó khó khăn hơn sau đó chỉ cần tách trên tất cả các ký hiệu và chạy với nó từ đó.

Điều tôi thực sự muốn làm là xác định regex chỉ phù hợp với dấu hỏi và ký hiệu được theo sau bởi dấu bằng trước khi được theo sau bởi dấu và (hoặc cuối dòng khác). Tôi đến với điều này mà đến gần nhưng là bao gồm các văn bản không phải chụp và tôi cũng không chắc chắn lý do tại sao:

[?&](?:[^&]+)= 

... mà kết quả trong một trận đấu trên ?uri= cũng như &type= mà gần nhưng chụp nhiều hơn tôi muốn. Tôi đang làm gì sai sao cho nó không chỉ ghi lại các kết quả phù hợp là ?&? Nói cách khác, nó chỉ nên chụp ? trước khi uri và & trước khi nhập.

+1

Bạn có thể cung cấp ví dụ về những gì bạn muốn nó khớp không? Tôi không hiểu mục đích là gì. – JDiPierro

+0

Cập nhật để hy vọng rõ ràng hơn một chút ... – James

+0

Kiểm tra http://papermashup.com/read-url-get-variables-withjavascript/ – igasparetto

Trả lời

6

Nếu tôi hiểu chính xác và bạn chỉ muốn khớp? hoặc & thì regex của bạn nên là:

[?&](?==) 

Giải thích:

[?&] là một tập hợp các ký tự chứa chỉ? và &. Có nghĩa là nó sẽ tìm kiếm một trong số đó.

(?=) Đây là một lookahead tích cực. Nó có nghĩa là "Điều này phải đến sau trận đấu chính nhưng không bao gồm nó". Vì vậy, để làm cho nó tìm thấy một = trông buồn cười như (?==)


Nếu bạn muốn bao gồm từ "uri" hoặc "loại" sau đó thêm một \w sau bộ ký tự và trước khi lookahead:

[?&]\w+(?==) 

+ có nghĩa là "trận đấu 1 hoặc nhiều"


Và chỉ là một hơn trong trường hợp đó là không chính xác những gì bạn đang tìm kiếm! Nếu bạn muốn loại bỏ các & /? nhưng giữ cho văn bản chúng ta sẽ bọc ký tự được đặt trong một lookBEHIND tích cực. Cú pháp cho điều đó là (?<=). Điều đó sẽ thay đổi regex này:

(?<=[?&])\w+(?==) 

Ví dụ về điều đó tại nơi làm việc: http://regexr.com?35q0u


Trong phản ứng để bình luận: Bạn có thể phù hợp với chỉ?và & bằng cách đặt \ w + bên trong lookahead tích cực:

[?&](?=\w+=) 

Và bởi vì tôi đang buồn chán và thích regexs một chút quá nhiều, đây là một trong đó sẽ phù hợp với giá trị của thẻ:

(?<==).*?(?=[&?]\w+=|$) 

Ví dụ: http://regexr.com?35q11 Có nhiều phần được đánh dấu vì đối sánh chung đang bật.

+0

Bởi vì bạn không có? hoặc & được theo sau bởi a =. Bạn có muốn khớp từ "uri" không? Trong trường hợp đó, nó sẽ như thế này: http://regexr.com?35q0r – JDiPierro

+0

Đóng ... Tôi chỉ muốn kết hợp &? được theo sau bởi a = trước dấu và. Nhưng tôi chỉ muốn * chụp * the & or ?, không phải bất kỳ văn bản nào sau đây. – James

+0

tức là ... Tôi không thể tìm ra cách thực hiện * non * -capture trong khi vẫn thực hiện trận đấu – James

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