正则表达式在字符串中查找要替换的特定标记

时间:2010-08-19 14:53:34

标签: php regex preg-match-all

我有一个带有一些代码的字符串(例如:«USER_ID#USERNAME #STATUS»)用于替换,如下例所示:

  

你好«USER_ID#USERNAME #STATUS»,你喜欢«PROD_ID#PRODNAME #STATUS»?

我需要找到一种方法来获取所有代码以供将来更换。

我可以使用此正则表达式轻松找到一个代码:

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

但无法找到使用preg_match_all获取所有代码的方法。

有人能帮助我吗?我正在使用PHP。

由于

3 个答案:

答案 0 :(得分:3)

你必须使你的模式不贪婪:

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

请参阅this

答案 1 :(得分:2)

$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开关。

我确信有人会很快修改正则表达式,以便它本身就是不合适的

答案 2 :(得分:0)

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"
  }
}