2015-05-25 16 views
5

Tôi đang cố viết biểu thức chính quy để chia chuỗi thành các phần tử riêng biệt bên trong các dấu ngoặc nhọn phù hợp. Trước hết, nó cần phải được đệ quy, và thứ hai tắt, nó phải trả về bù đắp (như với PREG_OFFSET_CAPTURE).Viết biểu thức để trích xuất dữ liệu theo cách đệ quy giữa dấu ngoặc đơn

Tôi thực sự nghĩ rằng đây có lẽ là một cách ít hiệu quả để xử lý dữ liệu này, nhưng tôi không chắc chắn về một kỹ thuật điều khiển hiệu suất dễ dàng hơn. (Nếu bạn đã có một, tôi rất thích nghe nó!)

Vì vậy, đầu vào có thể được định dạng này:

Hello {#name}! I'm a {%string|sentence|bit of {#random} text} 

Chế biến các dữ liệu là đủ dễ dàng nếu nó ở định dạng này :

Hello {#name}! I'm a {%string|sentence|bit of random text} 

Nhưng đó là dấu ngoặc nhọn đệ quy trong một bộ dấu ngoặc nhọn khác là vấn đề khi xử lý. Tôi đang sử dụng đoạn mã sau để tách chuỗi:

preg_match_all("/(?<={)[^}]*(?=})/m", $string, $braces, PREG_OFFSET_CAPTURE); 

Và như đã đề cập ở trên, nó rất đẹp cho hình thức đơn giản. Chỉ cần ít hơn cho các hình thức phức tạp hơn. Ý định cho điều này (và tôi có chức năng trong một hình thức không đệ quy) là thay thế từng khu vực được ngoặc đơn với nội dung được xử lý bởi các hàm, làm việc trở lên.

Lý tưởng nhất, tôi muốn có thể viết Hello {#name}! I'm a {%string|sentence|bit of {?(random == "strange") ? {#random} : "strange"}} text} và để có thể quản lý được.

Mọi trợ giúp sẽ được đánh giá rất nhiều.

+0

Vì vậy, cho 'Xin chào {} #name! Tôi là một {% string | câu | bit của {#random} text} ', bạn cần phải nắm bắt' {#name} ',' {% string | câu | bit của {#random} text} ', và' {#random} '? –

+0

Chính xác. Và tôi cũng cần nắm bắt vị trí lý tưởng! Mặc dù tôi vẫn nghĩ rằng có một cách tốt hơn để làm điều này, điều này mất một thời gian trong các chuỗi rất dài. – Forest

+0

Nếu mục tiêu của bạn là thay thế mỗi dấu ngoặc đơn, sử dụng mẫu đệ quy sẽ không hữu ích. Những gì bạn cần là thay thế dấu ngoặc đơn trong cùng cho đến khi không còn dấu ngoặc đơn nào trong chuỗi của bạn. –

Trả lời

2

Bạn có thể tận dụng sức mạnh regex PCRE của các nhóm chụp trong giao diện người xem và các chương trình con để có được các lớp nền lồng nhau {...}.

A regex demo is available here.

$re = "#(?=(\{(?>[^{}]|(?1))*+\}))#"; 
$str = "Hello {#name}! I'm a {%string|sentence|bit of {#random} text}"; 
preg_match_all($re, $str, $matches, PREG_OFFSET_CAPTURE); 
print_r($matches[1]); 

Xem IDEONE demo

Nó sẽ trả về một mảng với bắt {...} - như dây và vị trí của họ:

Array 
(
    [0] => Array 
     (
      [0] => {#name} 
      [1] => 6 
     ) 

    [1] => Array 
     (
      [0] => {%string|sentence|bit of {#random} text} 
      [1] => 21 
     ) 

    [2] => Array 
     (
      [0] => {#random} 
      [1] => 46 
     ) 

) 
+0

Điều đó giải quyết được vấn đề của tôi. Có phương pháp nào cũng được hỗ trợ với JavaScript không? Tôi đang làm việc này với PHP, nhưng tôi sẽ muốn chuyển nó vào một thời điểm nào đó với JavaScript. – Forest

+0

Trong JavaScript, không có hỗ trợ cho các chương trình con trong regex.Điều đó có nghĩa, bạn sẽ không thể kết hợp các dấu ngoặc nhọn lồng nhau với regex ở đó. –

+0

Tôi giả sử lựa chọn duy nhất của tôi cho rằng sẽ có một số hình thức của trình phân tích cú pháp/lexer hoặc một cái gì đó? – Forest

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