2012-02-23 33 views
8

Rất đơn giản, tôi cần khớp biểu tượng # bằng regex. Tôi đang làm việc trên máy dò tìm hashtag.Cách đối sánh biểu tượng pound (#) trong regex bằng php (đối với thẻ bắt đầu bằng #)

Tôi đã thử tìm kiếm trong google và trong ngăn xếp tràn. Một bài đăng có liên quan là here, nhưng vì anh ấy muốn xóa biểu tượng # khỏi chuỗi nên anh ấy không sử dụng regex.

Tôi đã thử các regexes /\b\#\w\w+//\b#\w\w+/ và chúng không hoạt động và nếu tôi xóa #, nó sẽ phát hiện từ đó.

+3

Bạn đã cố gắng thoát khỏi nó? ''\ #'' – Vitamin

+0

vui lòng gửi văn bản mẫu mà bạn muốn khớp. vấn đề của bạn không có khả năng là biểu tượng #, mà là regex bạn đang nhúng nó vào bên trong. – pocketfullofcheese

+0

@Vague: có vẻ như anh ấy đã làm, trong regex đầu tiên anh ấy đăng. –

Trả lời

5

Bạn không cần phải thoát khỏi nó (nó có thể là \b đó là ném nó đi):

if (preg_match('/^\w+#(\w+)/', 'abc#def', $matches)) { 
    print_r($matches); 
} 

/* output of $matches: 
Array 
(
    [0] => abc#def 
    [1] => def 
) 
*/ 
+1

Tôi muốn nó phát hiện #abcdef, không phải là #dày. –

+5

Nhưng bạn đã trả lời những gì tôi hỏi. –

10

# không có bất kỳ ý nghĩa đặc biệt trong một regex, trừ khi bạn sử dụng nó như là dấu phân cách. Vì vậy, chỉ cần đặt nó thẳng vào và nó sẽ làm việc.

Lưu ý rằng \b phát hiện ranh giới từ và trong #abc, ranh giới từ là sau # và trước abc. Do đó, bạn cần sử dụng\b là không cần thiết và bạn chỉ cần #\w\w+.

+0

Tại sao bạn cần '\ w' hai lần? Không phải '\ w +' có nghĩa là một hay nhiều? –

+0

Bởi vì nó theo cách đó trong OP. Lý tưởng nhất là tôi sử dụng '\ w {2,}' để có nghĩa là "hai hoặc nhiều hơn". –

+0

'\ b' trong' # \ b \ w' rõ ràng là không cần thiết. – Gumbo

0

Bạn có thể sử dụng regex sau: /\#(\w+)/ để đối sánh thẻ bắt đầu bằng # chỉ với thẻ bắt đầu bằng # hoặc: /\#\w+/ sẽ khớp với toàn bộ thẻ bắt đầu bằng #.

2

Với nhận xét về câu trả lời trước đó, bạn muốn tránh khớp với x#x. Trong trường hợp đó, bạn không cần \b nhưng \B:

\B#(\w\w+)

(nếu bạn thực sự cần hai hoặc nhiều ký tự-từ sau #).

\B có nghĩa là không-từ-ranh giới, và kể từ # không phải là một ký tự từ, điều này khớp chính xác nếu ký tự trước đó không phải là một ký tự từ.

+0

Một chút muộn, nhưng 1 anyway, bởi vì không ai khác chỉ ra điều này. –

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