#php
#php
Вопрос:
string string {format mat=34/} string string string string string string string string
string string {format mat=34/} string string string string string string string string
-
$pattern = «/{format[a-z0-9=s]*/}/i»;
str_replace($pattern, ‘test’, $strings);
он заменит все форматы в строке, я хочу заменить только первый «формат» и удалить все другие «формат». Как?
-
при получении результата совпадения «{format mat=34 /}». я хочу найти строку, начинающуюся с «mat =».
Итак, у меня есть это
$string = "{format mat=34/}";
$pattern = "/^mat=[0-9]*/"; // result is null
$pattern = "/mat=[0-9]*/"; // ok, but also effect with "{format wrongformat=34/}"
Как сопоставить строку, начинающуюся с «mat =»
Ответ №1:
(что касается первой части вашего вопроса)
Вы могли бы сопоставить первый формат с этим регулярным выражением, которое использует {n} для указания соответствия только первому вхождению
$pattern = "(^.*?{format[a-z0-9=s]*}.){1}"
Начинается с первого символа, выполняет не жадное сопоставление до первого формата, затем принимает ровно {1} его появление.
Выполните это, чтобы выполнить первоначальную замену, а затем в послесловиях выполните обычное str_replace для остальных форматов.
Комментарии:
1. спасибо за предложение. Как насчет regular-expressions.info/continue.html ?
Ответ №2:
Вот ваше решение:
$string = "string {format mat=34/} string string string {format mat=34/} string string string string {format mat=34/} string string string string string ";
// replace first match with 'test'
$string = preg_replace('/{format mat=[d]*/}/', 'test', $string, 1);
// remove all other matches
$string = preg_replace('/{format mat=[d]*/}/', '', $string);
Ответ №3:
- не str_replace, а preg_replace, параметр $limit в preg_replace ограничивает количество замен — просто установите его равным 1.
-
используйте b — границу слова.
$pattern = ‘/bmat=[0-9]*/’;
Ответ №4:
Для вашего первого вопроса вы могли бы использовать какой-то str_replace_once()
Пример найден в комментариях к руководству по PHP:
function str_replace_once($str_pattern, $str_replacement, $string)
{
if (strpos($string, $str_pattern) !== false)
{
$occurrence = strpos($string, $str_pattern);
return substr_replace($string, $str_replacement, strpos($string, $str_pattern), strlen($str_pattern));
}
return $string;
}
Чтобы удалить все остальные совпадения, смотрите ответ Сергея 🙂
Что касается вашего второго вопроса:
$string = '{format mat=34/}';
preg_match("|s(mat=[0-9] )/}$|", $string, $matches);
print_r($matches); // $matches[1] contains 'mat=34'