Regex находит определенные теги для замены в строке

У меня есть строка с некоторыми кодами (например: «USER_ID#USERNAME#STATUS») для замены, как в этом примере:

Здравствуйте, «USER_ID#USERNAME#STATUS», вам нравится «PROD_ID#PRODNAME#STATUS»?

Мне нужно найти способ получить все коды для будущей замены.

Я могу легко найти один код с этим регулярным выражением:

/«(.*)#(.*)#(.*)»/ 

но не могу найти способ получить все коды с помощью preg_match_all.

Кто-нибудь может мне помочь? Я использую PHP.

Спасибо


person Fernando Pereira    schedule 19.08.2010    source источник


Ответы (3)


Вы должны сделать свой шаблон нежадным:

/«(.*?)#(.*?)#(.*?)»/

См. это.

person Artefacto    schedule 19.08.2010

$string = "Hello «USER_ID#USERNAME#STATUS», do you like «PROD_ID#PRODNAME#STATUS»?";

preg_match_all('/«(.*)#(.*)#(.*)»/U',$string,$matches);

echo '<pre>';
var_dump($matches);
echo '</pre>';

дает

array(4) {
  [0]=>
  array(2) {
    [0]=>
    string(25) "«USER_ID#USERNAME#STATUS»"
    [1]=>
    string(25) "«PROD_ID#PRODNAME#STATUS»"
  }
  [1]=>
  array(2) {
    [0]=>
    string(7) "USER_ID"
    [1]=>
    string(7) "PROD_ID"
  }
  [2]=>
  array(2) {
    [0]=>
    string(8) "USERNAME"
    [1]=>
    string(8) "PRODNAME"
  }
  [3]=>
  array(2) {
    [0]=>
    string(6) "STATUS"
    [1]=>
    string(6) "STATUS"
  }
}

Обратите внимание на использование переключателя Ungreedy.

Я уверен, что скоро появится кто-то, кто изменит регулярное выражение, чтобы оно было нежадным по своей сути.

person Mark Baker    schedule 19.08.2010
comment
извините, плохо, io скопировал ваш образец, чтобы сохранить написание кода, и поставил отрицательный голос, дал вам положительный голос за неудобства и что ваш код в порядке. - person RobertPitt; 19.08.2010
comment
@Robert - вам лучше использовать пример Artefacto, который делает шаблон нежадным, а не нежадный переключатель; но все равно спасибо - person Mark Baker; 19.08.2010
comment
мой пример ниже, я не использую жадное сопоставление, (?<x>.*?) - person RobertPitt; 19.08.2010

пытаться

preg_match_all('/«(?<id>.*?)#(?<username>.*?)#(?<status>.*?)»/',$string,$matches);
echo $matches[0]['username'];

//And dont forget you have to loop.
foreach($matches as $match)
{
    echo $match['username'];
}

:)

array(7) {
  [0]=>
  array(2) {
    [0]=>
    string(27) "«USER_ID#USERNAME#STATUS»"
    [1]=>
    string(27) "«PROD_ID#PRODNAME#STATUS»"
  }
  ["id"]=>
  array(2) {
    [0]=>
    string(7) "USER_ID"
    [1]=>
    string(7) "PROD_ID"
  }
  [1]=>
  array(2) {
    [0]=>
    string(7) "USER_ID"
    [1]=>
    string(7) "PROD_ID"
  }
  ["username"]=>
  array(2) {
    [0]=>
    string(8) "USERNAME"
    [1]=>
    string(8) "PRODNAME"
  }
  [2]=>
  array(2) {
    [0]=>
    string(8) "USERNAME"
    [1]=>
    string(8) "PRODNAME"
  }
  ["status"]=>
  array(2) {
    [0]=>
    string(6) "STATUS"
    [1]=>
    string(6) "STATUS"
  }
  [3]=>
  array(2) {
    [0]=>
    string(6) "STATUS"
    [1]=>
    string(6) "STATUS"
  }
}
person RobertPitt    schedule 19.08.2010