2009-09-09 27 views
8

Ummm ... làm cách nào để sử dụng các biến trong lệnh gọi đến preg_replace?

này đã không làm việc:

foreach($numarray as $num => $text) 
    { 
     $patterns[] = '/<ces>(.*?)\+$num(.*?)<\/ces>/'; 
     $replacements[] = '<ces>$1<$text/>$2</ces>'; 
    } 

Vâng, $num được preceeded bằng dấu cộng. Có, tôi muốn "tag the $num as <$text/>".

Trả lời

12

Mẫu thay thế của bạn trông ok, nhưng vì bạn đã sử dụng dấu nháy đơn trong mẫu phù hợp, biến số $ num của bạn sẽ không được chèn vào đó. Thay vào đó, hãy thử

$patterns[] = '/<ces>(.*?)\+'.$num.'(.*?)<\/ces>/'; 
$replacements[] = '<ces>$1<'.$text.'/>$2</ces>'; 

Cũng lưu ý rằng khi xây dựng một mô hình từ nguyên liệu đầu vào "không rõ" như thế này, nó thường là một ý tưởng tốt để sử dụng preg_quote. ví dụ.

$patterns[] = '/<ces>(.*?)\+'.preg_quote($num).'(.*?)<\/ces>/'; 

Mặc dù tôi đoán tên biến luôn luôn là số trong trường hợp của bạn.

+0

Cảm ơn Gumbo, Paul - cả hai yếu tố đầu vào của bạn đều hữu ích! – Steve

12

Biến sẽ chỉ được mở rộng trong strings declared with double quotes. Vì vậy, hoặc sử dụng dấu ngoặc kép:

$patterns[]  = "/<ces>(.*?)\\+$num(.*?)<\\/ces>/"; 
$replacements[] = "<ces>$1<$text/>$2</ces>"; 

Hoặc sử dụng nối chuỗi:

$patterns[]  = '/<ces>(.*?)\+'.$num.'(.*?)<\/ces>/'; 
$replacements[] = '<ces>$1<'.$text.'/>$2</ces>'; 

Bạn cũng nên có một cái nhìn tại preg_quote nếu các biến của bạn có thể chứa biểu thức chính quy ký tự meta.

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