2012-04-16 38 views
5

Hiện tại tôi đang phát triển một ứng dụng web để tìm nạp luồng Twitter và cố gắng tự tạo ngôn ngữ tự nhiên.Tách chuỗi có chứa các chữ cái và số không tách biệt bởi bất kỳ dấu tách cụ thể nào trong PHP

Vì dữ liệu của tôi là từ Twitter (giới hạn 140 ký tự) có nhiều từ được rút ngắn hoặc trong trường hợp này, không gian bị bỏ qua.

Ví dụ:

"Hi, my name is Bob. I m 19yo and 170cm tall" 

Nên tokenized tới:

- hi 
- my 
- name 
- bob 
- i 
- 19 
- yo 
- 170 
- cm 
- tall 

ý rằng 19yo trong 19yokhông gian giữa chúng. Tôi sử dụng nó chủ yếu để trích xuất số với các đơn vị của họ.

Đơn giản, những gì tôi cần là một cách để 'phát nổ' mỗi mã thông báo có số trong đó bằng số hoặc chữ số mà không cần dấu phân cách.

'123abc' sẽ ['123', 'abc']

'abc123' sẽ ['abc', '123']

'abc123xyz' sẽ ['abc', '123', 'xyz']

và vân vân.

Cách tốt nhất để đạt được điều đó trong PHP là gì?


Tôi đã tìm thấy thứ gì đó gần với nó, nhưng đó là C# và không đáng kể để tách ngày/tháng. How do I split a string in C# based on letters and numbers

+1

#just tò mò, tại sao bạn cần khai thác như vậy? – hjpotter92

+1

Tôi có thể thấy làm điều này để tạo slug động, nhưng nó cũng có thể được thực hiện chỉ với không gian/dấu chấm câu phân định. – Dutchie432

+0

@ theo dõi chết vì nguồn dữ liệu (luồng twitter) có văn bản không nhất quán – akhyar

Trả lời

7

Bạn có thể sử dụng preg_split

$string = "Hi, my name is Bob. I m 19yo and 170cm tall"; 
$parts = preg_split("/(,?\s+)|((?<=[a-z])(?=\d))|((?<=\d)(?=[a-z]))/i", $string); 
var_dump ($parts); 

Khi phù hợp chống lại các ranh giới chữ số chữ, trận đấu biểu thức chính quy phải zero-chiều rộng. Bản thân các nhân vật không được bao gồm trong trận đấu. Đối với điều này, zero-width lookarounds rất hữu ích.

http://codepad.org/i4Y6r6VS

+0

Vâng, điều đó dường như không hoạt động đúng cách. (http://codepad.org/4lWwbs4g) – Dutchie432

+0

Không ngay cả trên đầu vào được cung cấp (http://codepad.org/NsTWhhDX) – jprofitt

+0

Xin lỗi, chưa thử nghiệm nó. Không biết codepad.org tồn tại. Sẽ tận dụng nó ngay bây giờ. –

1

thế nào về điều này:

bạn trích xuất số từ chuỗi bằng cách sử dụng regexps, lưu trữ chúng trong một mảng, thay thế số trong chuỗi với một số loại ký tự đặc biệt, mà sẽ 'giữ' vị trí của họ . và sau khi phân tích cú pháp chuỗi chỉ được tạo bởi các ký tự đặc biệt và các ký tự thông thường, bạn sẽ cung cấp các số của bạn từ mảng đến các vị trí được đặt riêng của chúng.

chỉ là một ý tưởng, nhưng imho có thể phù hợp với bạn.

EDIT: cố gắng chạy mã ngắn này, hy vọng bạn sẽ thấy điểm của tôi ở đầu ra. (mã này không hoạt động trên codepad, không biết tại sao)

<?php 
$str = "Hi, my name is Bob. I m 19yo and 170cm tall"; 
preg_match_all("#\d+#", $str, $matches); 
$str = preg_replace("!\d+!", "#SPEC#", $str); 

print_r($matches[0]); 
print $str; 
+0

thú vị, nhưng cũng có một chút khó hiểu với tôi .. bạn có thể cho tôi một số giải thích bổ sung? – akhyar

+0

câu trả lời đã được chỉnh sửa, hãy kiểm tra. nếu bạn cần giải thích thêm, chỉ cần hỏi, hỗ trợ toàn bộ bệnh sau khi tôi ngủ;) – xholicka

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