Включая новые строки в PHP preg_replace функция

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

    slotObj[slotId] = {
        ['slotContent' + i]: { // <-- made unique using iterator ;)
            'templateNo': assetItem.dataset.template,
            'assetId': assetItem.dataset.contentId
        }
    }
15
задан DisgruntledGoat 29 March 2009 в 23:41
поделиться

3 ответа

Используйте s модификатор:

$template = preg_replace( $'/\{a\}([.\n]+)\{\/a\}/s', 'X', $template, -1, $count );
//                                                ^
echo $count;
33
ответ дан 1 December 2019 в 00:45
поделиться

Из http://www.regular-expressions.info/dot.html:

"Точка соответствует отдельному символу, не заботясь, каков тот символ. Единственным исключением являются символы новой строки".

необходимо будет добавить запаздывание/s флаг к выражению.

3
ответ дан 1 December 2019 в 00:45
поделиться

Я думаю, что Вы имеете больше проблем, чем просто точка не соответствие новым строкам, но позволяете мне запуститься с рекомендации форматирования. Можно использовать примерно любой знак пунктуации в качестве regex разделителя, не только наклонной черты (' / '). При использовании другого символа Вы не должны будете выходить из наклонных черт в regex. Я понимаю, что '%' популярен среди PHPers; это сделало бы Ваш аргумент шаблона:

'%\{a\}([.\n]+)\{/a\}%'

Теперь, причина, что regex не работал, поскольку Вы предназначили, то, потому что точка теряет свое особое значение, когда это появляется в классе символов (квадратные скобки) - так [.\n] просто соответствует точке или переводу строки. То, что Вы искали, было (?:.|\n), но я рекомендовал бы соответствовать возврату каретки, а также переводу строки:

'%\{a\}((?:.|[\r\n])+)\{/a\}%'

Поэтому слово "новая строка" может относиться к стилю Unix "\n", стиль Windows "\r\n", или более старый стиль Mac "\r". Любая данная веб-страница может содержать любой из тех или смесь двух или больше стилей; соединение "\n" и "\r\n" очень распространено. Но с/s режимом (также известный как одна строка или режим DOTALL), Вы не должны волноваться об этом:

'%\{a\}(.+)\{/a\}%s'

Однако существует другая проблема с исходным regex, это все еще присутствует в этом: + является жадным. Это означает, если существует больше чем один {a}...{/a} последовательность в тексте, в первый раз, когда Ваш regex применяется, он будет соответствовать всем им, сначала {a} к последнему {/a}. Самый простой способ зафиксировать, который должен сделать + нежадный (иначе, "ленивый" или "отказывающийся") путем добавления вопросительного знака:

'%\{a\}(.+?)\{/a\}%s'

Наконец, я не знаю, что сделать из '$' перед вводной кавычкой Вашего аргумента шаблона. Я не делаю PHP, но это похоже на синтаксическую ошибку мне. Если бы кто-то мог бы обучить меня этому вопросу, я ценил бы его.

7
ответ дан 1 December 2019 в 00:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: