У меня есть следующий источник:
<font color="black">0</font><font color="white">1101100001001101</font><font color="black">1</font><font color="white">0110</font>
И хотел бы заменить все белые 1
и 0
пробелами. Я могу легко их сопоставить с
/<font color="white">([10]*)</font>/g
Есть ли шаблон замены (я использую PHP) для создания того же количества пробелов для сопоставимой группы $1
?
Результат должен выглядеть так:
<font color="black">0</font><font color="white"> </font><font color="black">1</font><font color="white"> </font>
(И, пожалуйста, проигнорируйте тот факт, что я разбираю HTML с регулярными выражениями здесь. Меня больше интересует решение проблемы с регулярным выражением, чем в HTML.)
$test = '<font color="black">0</font><font color="white">1101100001001101</font><font color="black">1</font><font color="white">0110</font>'; echo preg_replace ('~(<font color="white">)([10]*)(</font>)~e', '"\\1" . str_repeat(" ", strlen ("\\2")) . "\\3"', $test);
Попробуйте это здесь
<?php $string = '<font color="black">0</font><font color="white">1101100001001101</font><font color="black">1</font><font color="white">0110</font>'; $pattern = '/(?<=<font color="white">)( *?)[10](?=.*?<\/font>)/'; $replacement = '$1 '; while (preg_match($pattern, $string)) { $string = preg_replace($pattern, $replacement, $string); } echo $string;
Я использую положительный внешний вид (?<=<font color="white">)
для поиска цветовой части. И положительный взгляд вперед (?=.*?<\/font>)
для конца.
Затем я сопоставляю уже замененные пространства и помещаю их в группу 1, а затем в [10]
.
Затем я делаю цикл while до тех пор, пока шаблон больше не будет соответствовать, а заменитель с уже заменяет пробелы и новое найденное пространство.
Это регулярное выражение будет соответствовать только 1
| 0
если ему предшествует "white">
.
синтаксис (?<=...)
в regex называется положительным lookbehind …
(?<="white">)([10]+)