PHP str_replace каждый раз имеет разное значение?

Я хочу сделать str_replace для строки HTML, каждый раз, когда нахожу элемент соответствия, значение также будет увеличиваться.

$link = 1;

$html = str_replace($this->link, $link, $html);

Это заменит все сразу, и с той же строкой $link я бы хотел, чтобы $link увеличивался каждый раз, когда он находил совпадение. Является ли это возможным?

Большое спасибо


person Bill    schedule 29.04.2012    source источник
comment
Используйте php.net/manual/en/function.preg-replace-callback .php и увеличьте счетчик в вашей функции обратного вызова.   -  person Dan Grossman    schedule 29.04.2012
comment
Согласен с Дэном. Затем просто подсчитайте, сколько совпадений найдено.   -  person Philip    schedule 29.04.2012


Ответы (2)


Если я вас правильно понял (вы хотите, чтобы каждое совпадение было заменено растущим целым числом), казалось бы, комментарии к вопросу, побуждающие вас использовать preg_replace_callback, будут правильными:

$str = 'Hello World';
$cnt = 0;

function myCallback ( $matches ) {
  global $cnt;
  return ++$cnt;
}

// He12o Wor3d
echo preg_replace_callback( '/\l/', 'myCallback', $str );
person Sampson    schedule 29.04.2012
comment
это myCallback, что, если он в классе? echo preg_replace_callback('/\l/', $this-›myCallback, $str); не работает - person Bill; 29.04.2012
comment
preg_replace_callback('/\l/', 'self::myCallback', $text); это тоже работает - person Bill; 30.04.2012

Вы можете использовать регулярное выражение, чтобы вернуть, сколько замен оно делает.

<?php
$string = "red green green blue red";

preg_replace('/\b(green)\b/i', '[removed]', $string, -1 , $results);
echo $results; // returns '2' as it replaces green twice with [removed]
?>
person Menztrual    schedule 29.04.2012