2012-02-04 8 views
9

Tôi đã thấy hầu hết các ví dụ không có ký tự^(dấu mũ) và $ (tiền tệ hoặc đô la) để đánh dấu sự bắt đầu của một chuỗi được khớp. Tuy nhiên, tôi không tìm thấy bất cứ điều gì liên quan đến điều này trong spec html5. Chúng có tiềm ẩn trong mô hình không? Thông số html5 nói rằng chúng ngầm định.

Biểu thức chính quy mẫu được biên dịch, khi được đối sánh với một chuỗi, phải có bắt đầu của nó được neo vào đầu chuỗi và cuối của nó được neo vào cuối chuỗi. Điều này ngụ ý rằng ngôn ngữ biểu thức chính quy được sử dụng cho thuộc tính này giống như ngôn ngữ được sử dụng trong JavaScript, ngoại trừ thuộc tính pattern được so khớp với toàn bộ giá trị, không chỉ bất kỳ tập con nào (như thể nó ngụ ý^(?: at) sự bắt đầu của mẫu và a) $ ở cuối).

Trong kiểu nhập "văn bản", mẫu hoạt động tốt bằng định dạng, tuy nhiên trong đầu vào loại = "tel", tôi phải xóa ký tự để regex hoạt động như mong đợi. Tôi đã thử nghiệm trong cả Opera và Firefox.

Đây có phải là lỗi trình duyệt không? Tôi có nên nộp lỗi trong bugzilla, v.v. không?


Edit: Dường như tôi đã vấp uppon một lỗi kì lạ, bởi vì tôi không có khả năng tạo ra một trường hợp thử nghiệm giảm. Một đầu vào đơn giản trong một trang không hiển thị hành vi được nêu ở trên. Tuy nhiên, câu hỏi vẫn còn. Tôi có nên, hoặc tôi không nên sử dụng darn^và $ neo?

+1

https://developer.mozilla.org/en/HTML/Forms_in_HTML đề cập đến điều này trên đầu vào 'tel': * Ngắt dòng sẽ tự động bị tước khỏi giá trị đầu vào, nhưng không có cú pháp nào khác được thực thi, bởi vì số điện thoại thay đổi rộng rãi quốc tế. Bạn có thể sử dụng các thuộc tính như pattern và maxlength để hạn chế các giá trị được nhập trong điều khiển. Nó không đề cập đến bất cứ điều gì cụ thể về kiểu 'tel' trong mô tả thuộc tính' pattern' của nó. –

+0

Trên thực tế, nếu tôi kiểm tra với Firefox, tôi không thấy bất kỳ hành vi lạ nào trong đầu vào 'tel'. Bạn có thể đưa ra một ví dụ đầy đủ bao gồm mã, những gì bạn mong đợi, và những gì bạn đã thay thế? –

+0

Vâng, tôi vừa mới nhận thấy điều đó và đã thêm bản chỉnh sửa cho câu hỏi. Hình thức của tôi hơi khó để đăng bài ở đây, nhưng tôi sẽ xem những gì tôi có thể làm. –

Trả lời

2

ofcourse bạn biết số điện thoại có các hình thức khác nhau,

ví dụ:

  • khi đang ở Vienna, Áo, quay số "4000" sẽ kết nối bạn với Tòa thị chính.
  • khi đang ở Innsbruck, Áo, bạn cần quay số "014000" để quay số Tòa thị chính Vienna
  • khi đang ở New York, Hoa Kỳ bạn cần quay số +4314000 để quay số tương tự.

Điều này có lý do lịch sử, với hệ thống cơ khí cũ giao công việc kết nối cuộc gọi từ thiết bị này sang thiết bị khác với mọi chữ số (Đây cũng là lý do tại sao tiện ích mở rộng ở cuối số khi bắt đầu, hãy bỏ qua DNS nơi bạn có thể mở rộng tên miền của mình ở phía trước, nhưng không phải là cuối cùng)

Bây giờ một regex với cả hai neo ^$ sẽ chỉ khớp với một số điện thoại, nếu nó được cung cấp chính xác cùng một hình thức. Chỉ với số neo $, số này sẽ khớp đáng tin cậy với cùng một số điện thoại, miễn là không có tiện ích mở rộng khác. Không có neo, tức là thả ^$ sẽ khớp với các mã vị trí và tiện ích mở rộng độc lập, nhưng sẽ giới thiệu không đáng tin cậy:

Sử dụng "4000" làm mẫu cho Tòa thị chính Vienna sẽ khớp với "4000", "014000" và "+ 4314000 ", nhưng nó cũng sẽ khớp với" +44140001 "là một Ngân hàng Đức.

+0

Tôi hơi bối rối một chút. Có lẽ tôi nên đăng một ví dụ với câu hỏi của tôi. Ví dụ: sử dụng "^ [\ d] {10} $" không khớp với 1234567890 trong đầu vào tel, nhưng phải không? –

+0

Cuộc nói chuyện về số điện thoại này đến từ đâu? Câu hỏi đã thay đổi chưa? – Borodin

+0

Không, nó nói về đầu vào TEL cụ thể –

2

Theo tiêu chuẩn, the regex is anchored at the start and end. Tuy nhiên, trong thực tế (thử nghiệm FF 15 và Chrome 21) nó được neo tại đầu chỉ!

Vì vậy, nếu bạn muốn tương thích cả với tiêu chuẩn và thực tế, bạn nên neo regex của mình với một số $ một cách rõ ràng. Việc sử dụng ^ cũng tùy thuộc vào bạn - không cần thiết.

+0

Ok vậy, tình nguyện viên để nộp lỗi? –