Почему preg_replace дает этот вывод? - PullRequest
3 голосов
/ 17 августа 2010

Я просто не могу понять это, по некоторым причинам это:

$string = "#mainparent {
position: relative;
top: 100px;
left: 100px;
width:4994px;
}";

$elementwidth = "88";

  $re1='(.*?)'; # Non-greedy match on filler
  $re2='(mainparent)';  # Word 1
  $re3='(.*)';  # Non-greedy match on filler
  $re4='(width:)';
  $re5='(.*)';  # Word 2
  $re6='(;)';   # Any Single Character 1
$pattern="/".$re1.$re2.$re3.$re4.$re5.$re6."/s";
    $replacement= '$1'.'$2'.'$3'. '$4'. $element_width .'$6';
    $return_string = preg_replace_component ($string, $pattern, $replacement );
     #c}

     echo $return_string; return;

выведите это (ниже), я не могу понять, почему оно заменяет "width:" на основе способа, которым я его настроил ... любой совет приветствуется

#mainparent { position: relative; top: 100px; left: 100px; 88; } 

1 Ответ

5 голосов
/ 17 августа 2010

Проблема в том, что ваша замещающая строка выглядит следующим образом:

'$1$2$3$488$6'
       ^^^

Поскольку символ, следующий сразу за номером группы, является цифрой, он интерпретируется как группа 48, а не как группа 4.

См. Руководство preg_replace"Пример # 1 Использование обратных ссылок с последующими числовыми литералами". Наименьшее изменение, которое требуется для его работы, - это окружить 4 фигурными скобками так, чтобы он отделился от 88.

$replacement = '$1' . '$2' . '$3'. '${4}'. $element_width . '$6';

Но это не очень хороший способ сделать это, а также есть ряд проблем с вашим кодом.

  • Регулярные выражения не очень подходят для анализа и изменения CSS.
  • Сначала вы пишете $elementwidth, а затем пишете $element_width.
  • Нет необходимости создавать 6 разных групп, если вы собираетесь заменить только одну из них.
...