2013-04-22 20 views
5

Tôi đang phân tích chuỗi trước khi gửi nó đến một DB. Tôi muốn đi qua tất cả các <br> trong chuỗi đó và thay thế chúng bằng số duy nhất mà tôi nhận được từ một mảng theo sau là một newLine.Thay thế tất cả các lần xuất hiện của một chuỗi có giá trị từ một mảng

Ví dụ:

str = "Line <br> Line <br> Line <br> Line <br>" 
$replace = array("1", "2", "3", "4"); 

my function would return 
"Line 1 \n Line 2 \n Line 3 \n Line 4 \n" 

Âm thanh đủ đơn giản. Tôi sẽ chỉ làm một vòng lặp trong khi, có được tất cả các lần xuất hiện của <br> bằng cách sử dụng strpos, và thay thế những người có số lượng yêu cầu + \ n bằng cách sử dụng str_replace.

Vấn đề là tôi luôn gặp lỗi và tôi không biết mình đang làm gì sai? Có lẽ là một sai lầm ngớ ngẩn, nhưng vẫn còn khó chịu.

Đây là mã của tôi

$str  = "Line <br> Line <br> Line <br> Line <br>"; 
$replace = array("1", "2", "3", "4"); 
$replaceIndex = 0; 

while(strpos($str, '<br>') != false) 
{ 
    $str = str_replace('<br>', $replace[index] . ' ' .'\n', $str); //str_replace, replaces the first occurance of <br> it finds 
    index++; 
} 

Bất kỳ ý tưởng xin vui lòng?

Cảm ơn trước,

+0

Vâng đầu tiên, tất cả trong phiên đầu tiên bạn sẽ thay thế tất cả các trường hợp của '
'.... Để làm theo cách này bạn sẽ phải chỉ phần replce của chuỗi sử dụng' substr_replace' cho phép bạn xác định các vị trí cho anh ta thay thế. – prodigitalson

Trả lời

6

Tôi sẽ sử dụng một regex và một callback tùy chỉnh, như thế này:

$str = "Line <br> Line <br> Line <br> Line <br>"; 
$replace = array("1", "2", "3", "4"); 
$str = preg_replace_callback('/<br>/', function($match) use(&$replace) { 
    return array_shift($replace) . ' ' . "\n"; 
}, $str); 

Lưu ý rằng điều này giả định chúng ta có thể sửa đổi mảng $replace. Nếu đó không phải là trường hợp, bạn có thể giữ một bộ đếm:

$str = "Line <br> Line <br> Line <br> Line <br>"; 
$replace = array("1", "2", "3", "4"); 
$count = 0; 
$str = preg_replace_callback('/<br>/', function($match) use($replace, &$count) { 
    return $replace[$count++] . ' ' . "\n"; 
}, $str); 

Bạn có thể nhìn thấy từ this demo rằng kết quả đầu ra này:

Line 1 Line 2 Line 3 Line 4 
+0

Bạn trả lời các công việc và str được phân tích cú pháp chính xác, nhưng vì một lý do nào đó nó không được chèn vào DB khi tôi gọi INSERT INTO. Mọi ý tưởng tại sao? – r3x

+0

@ r3x - Làm cách nào? Bạn có thông báo lỗi không? Nếu bạn đang tìm cách in các ký tự '\ n' theo nghĩa đen thay vì để PHP giải thích rằng đối với ký tự dòng mới, hãy thay đổi dấu ngoặc kép xung quanh' "\ n" 'thành dấu nháy đơn. – nickb

+0

Đây là truy vấn chèn của tôi (về cơ bản là lãi suất của chuỗi phân tích cú pháp). 'mysql_query (" INSERT INTO $ tbl_name (giá trị userID, storyID, rank, storyType, interestTable) ('$ userID', '$ storyID', '$ rank', '$ storyType', '$ interestTable') ", $ dbh1); 'Nếu tôi xóa giá trị của interestTable khỏi truy vấn này thì mọi thứ hoạt động tốt, nhưng nếu tôi thêm nó thì không có gì được gửi đi. Đối với các lỗi, tôi đã không nhận được bất kỳ. Weird: S – r3x

1
$str = str_replace('<br>', $replace[$index] . ' ' .'\n', $str); 

Đây là thay thế ALL các lần xuất hiện của <br> nó tìm thấy.

Chính xác là chỉ thực hiện một thay thế duy nhất cho mỗi lần lặp: substr_replace có thể thay thế một phần của chuỗi. Đúng sẽ là:

while($pos = strpos($str, '<br>') !== false) 
{ 
    $str = substr_replace($str, $replace[$replaceIndex] . ' ' .'\n', $pos, 4); // The <br> is four bytes long, so 4 bytes from $pos on. 
    $replaceIndex++; 
} 

(! Đừng quên $ trước replaceIndex$replaceIndex là một biến)

+1

Tham số thứ 4 tới 'str_replace' không thay thế bao nhiêu lần. Đó là một tham chiếu được thiết lập cho bao nhiêu thời gian * đã * thay thế. –

0

Bạn cần phải nhớ $ trước của các biến. Ngoài ra, hãy thử sử dụng php regex function, cho phép chỉ định số lượng thay thế.

<?php 
$str  = "Line <br> Line <br> Line <br> Line <br>"; 
$replace = array("1", "2", "3", "4"); 
$index = 0; 
$count = 1; 

while(strpos($str, '<br>') != false) 
{ 
    $str = preg_replace('/<br>/', $replace[$index] . " \n", $str, 1); //str_replace, replaces the first occurance of <br> it finds 
    $index++; 
} 
echo $str 
?> 
+0

Tham số cuối cùng không cho phép bạn đặt số lượng thay thế. Đó là một tham chiếu được thiết lập cho số lượng thay thế nó * đã làm *. –

+0

Tôi đang đề cập đến biến giới hạn $ trong [preg_replace] (http://php.net/manual/en/function.preg-replace.php). – George

+0

Tôi nghĩ bạn đang sử dụng tham số '$ count'. Đừng bận tâm :-) –

1

nếu bạn chỉ muốn đếm, bạn cũng có thể sử dụng nó.

$str_expl = explode('<br>',$str); 
foreach($str_expl as $index=>&$str) 
    if(!empty($str)) 
     $str .= ($index+1); 
$str = implode($str_expl); 
+0

nếu bạn muốn thay thế các mục đã tìm thấy bằng mảng của riêng mình, bạn có thể thay đổi 'str. = ($ Index + 1)' thành 'str. = $ MyArray [index];' – ikkez

0

Đây là phiên bản của tôi. 8 dòng định dạng, không có regex, KISS.

$str = "Line <br> Line <br> Line <br> Line <br>"; 
$replace = array("1", "2", "3", "4"); 

$temp = explode("<br>", $str); 
$result = ""; 
foreach ($temp as $k=>$v) { 
    $result .= $v; 
    if ($k != count($temp) - 1) { 
     $result .= $replace[$k]; 
    } 
} 

echo $result;