php — regexp — результат множественного совпадения

#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 
  
  1. $pattern = «/{format[a-z0-9=s]*/}/i»;

    str_replace($pattern, ‘test’, $strings);

    он заменит все форматы в строке, я хочу заменить только первый «формат» и удалить все другие «формат». Как?

  2. при получении результата совпадения «{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:

  1. не str_replace, а preg_replace, параметр $limit в preg_replace ограничивает количество замен — просто установите его равным 1.
  2. используйте 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'