2012-10-29 34 views
6

Tôi đang cố gắng cung cấp cho khách hàng khả năng gọi một hàm có nhiều đoạn mã khác nhau bằng cách chèn một mã ngắn vào trình soạn thảo WYSIWYG của họ.php thay thế cụm từ thông dụng thay vì chuỗi thay thế

Ví dụ, họ sẽ viết một cái gì đó giống như ...

[getSnippet(1)] 

này sẽ gọi getSnippet ($ id) php function của tôi và đầu ra thích hợp 'đoạn'.

Nó hoạt động khi tôi cứng mã $ id như thế này ...

echo str_replace('[getSnippet(1)]',getSnippet(1),$rowPage['sidebar_details']); 

Tuy nhiên, tôi thực sự muốn làm cho '1' năng động. Tôi loại đi đúng hướng với một cái gì đó giống như ...

function getSnippet($id) { 
if ($id == 1) { 
    echo "car"; 
} 
} 

$string = "This [getSnippet(1)] is a sentence.This is the next one."; 
$regex = '#([getSnippet(\w)])#'; 
$string = preg_replace($regex, '. \1', $string); 

//If you want to capture more than just periods, you can do: 
echo preg_replace('#(\.|,|\?|!)(\w)#', '\1 \2', $string); 

Không hẳn làm việc :(

+0

Điều gì không hoạt động với mã của bạn? – hakre

+0

Nhìn vào 'preg_replace_callback()'. Nó cho phép bạn cung cấp một hàm nhận các bit của chuỗi được kết hợp bởi một regexp và nó trả về thay thế. – Barmar

Trả lời

0

Thứ nhất trong regex của bạn, bạn cần phải thêm dấu ngoặc chữ (những người bạn vừa chụp \w nhưng rằng sẽ không phù hợp với bản thân ngoặc):

$regex = '#(\[getSnippet\((\w)\)\])#'; 

tôi cũng thoát khỏi dấu ngoặc vuông, nếu không họ sẽ mở một lớp nhân vật cũng phải nhận thức được rằng đây chụp chỉ một ký tự cho tham số

.!

Nhưng tôi khuyên bạn nên sử dụng preg_replace_callback, với một regex như thế này:

function getSnippet($id) { 
    if ($id == 1) { 
     return "car"; 
    } 
} 

function replaceCallback($matches) { 
    return getSnippet($matches[1]); 
} 

$string = preg_replace_callback(
    '#\[getSnippet\((\w+)\)\]#', 
    'replaceCallback', 
    $string 
); 

Lưu ý rằng tôi đã thay đổi echo trong getSnippet của bạn đến một return.

Trong khi gọi lại $matches[1] sẽ chứa nhóm được chụp đầu tiên, trong trường hợp này là tham số của bạn (trường hợp này cho phép nhiều ký tự). Tất nhiên, bạn cũng có thể điều chỉnh chức năng getSnippet để đọc id từ mảng $matches thay vì chuyển hướng qua replaceCallback.

Nhưng cách tiếp cận này ở đây hơi linh hoạt hơn vì nó cho phép bạn chuyển hướng đến nhiều hàm. Ví dụ: nếu bạn thay đổi regex thành #\[(getSnippet|otherFunction)\((\w+)\)\]# thì bạn có thể tìm thấy hai hàm khác nhau và replaceCallback có thể tìm ra tên hàm trong $matches[1] và gọi hàm có thông số $matches[2]. Như thế này:

function getSnippet($id) { 
    ... 
} 

function otherFunction($parameter) { 
    ... 
} 

function replaceCallback($matches) { 
    return $matches[1]($matches[2]); 
} 

$string = preg_replace_callback(
    '#\[(getSnippet|otherFunction)\((\w+)\)\]#', 
    'replaceCallback', 
    $string 
); 

Nó thực sự phụ thuộc vào nơi bạn muốn đi với điều này. Điều quan trọng là, không có cách nào để xử lý một tham số tùy ý trong một thay thế mà không cần sử dụng preg_replace_callback.

+0

Cảm ơn bạn rất nhiều vì đã trả lời nhanh. Điều này có vẻ thực sự gần vào thời điểm này. Khi tôi sử dụng một chuỗi như ... '$ string =" [getSnippet (1)] ijioj oiajs này dfoij dsofij aoisfj oiasdfj. [GetSnippet (2)] adfas asd as f. ";' Tôi chỉ nhận văn bản được trả lại từ hàm nhưng mất văn bản khác ... 'tức là: Ô tô. Thuyền.' Nhưng phải là ... ' "Ô tô. Ijioj oiajs dfoij dsofij aoisfj oiasdfj. Thuyền. Adfas asd as f." ' Xin cảm ơn một lần nữa. –

+0

Câu trả lời của bạn khá hiệu quả theo cách tôi muốn trừ khi phần còn lại của văn bản trong câu của tôi bị xóa. Chỉ văn bản được trả về bởi các cuộc gọi hàm còn lại. Cảm ơn một lần nữa. –

+0

Vui lòng thay đổi 'echo' trong' getSnippet' thành 'return'. Tôi nghĩ rằng tôi đã thay đổi điều đó, nhưng dường như tôi đã thực hiện một số lỗi sao chép dán ở đó. –

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