#php #регулярные_выражения
Например, есть строка: $str='abc0|def0ghi0|ghi'; Нужно заменить 0, на _NULL_. Но только в тех местах, где 0 внутри вертикальных палок. То есть, должно получиться abc0|def_NULL_ghi_NULL_|ghi preg_replace('/\|(.*)0(.*)\|/U', '$1_NULL_$2', $str); Заменяет всё, что между палок. Как заменить только нули?
Ответы
Ответ 1
Лучше вначале сделать split/explode для строки, потом, для всех элементов от 1 до count(...)-2 сделать нужную замену (а она теперь будет тривиальной) и потом сделать join. $str = 'abc0|def0ghi0|ghi'; $a = explode('|', $str); for ($i = 1; $i < count($a)-2; $i++) { $a[$i] = str_replace('0', '_NULL_', $a[$i]); } $str = join('|', $a); Диапазон такой, что бы не учитывать начальный/конечный элемент. При желании, можно вместо цикла использовать array_map или подобное.Ответ 2
В данном случае можно обойтись и без регулярного выражения, однако в более трудных случаях, когда необходимо заменить любое число подстрок между двух одинаковых подстрок, можно воспользоваться функцией preg_replace_callback и простой регуляркой типа /DELIM1(.*?)DELIM2/s, а внутри анонимной функции обратного вызова можно будет произвести любые необходимые манипуляции с совпадением: $delim = '|'; $s = 'abc0|def0ghi0|ghi'; echo preg_replace_callback( '/(' . preg_quote($delim, '/') . ')(.*?)(' . preg_quote($delim, '/') . ')/s', function($m) { return $m[1] . str_replace('0', '', $m[2]) . $m[3]; }, $s); // => abc0|defghi|ghi См. PHP-демо preg_quote($delim, '/') - экранирует все специальные знаки в $delim /\|(.*?)\|/s - этот шаблон находит буквальный символ |, любые 0 и более знаков, однако как можно меньше, и затем снова | $m[1] – это значение первой захватывающей подмаски (группы), $m[2] – второй и т.д. Конечно, можно в данном случае заменить .*? более эффективным исключающим символьным классом [^|] (= любой символ кроме |).Ответ 3
Вот вам пример замены нулей с помощью регулярного выражения и функции preg_replace_callback. Это работающая регулярка: #\|[^\|0]*((0)[^\|]*)*\|#m Вот измененная строка автора: $str = 'abc0|def0ghi0fd0dfdsf0|ghi|sdfdf0sdfdf0sdfds|sdfd'; Это код php дает нам нужный ответ в виде измененной строки: А это пример самого ответа: abc0|def_NULL_ghi_NULL_fd_NULL_dfdsf_NULL_|ghi|sdfdf_NULL_sdfdf_NULL_sdfds|sdfd
Комментариев нет:
Отправить комментарий