php - 正则表达式 - 多重匹配结果

时间:2011-04-19 17:08:00

标签: 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 =”开头的字符串。

  3. 所以我有这个

    $string = "{format mat=34/}";
    $pattern = "/^mat=[0-9]*/"; // result is null
    $pattern = "/mat=[0-9]*/"; // ok, but also effect with "{format wrongformat=34/}"
    

    如何匹配以“mat =”开头的字符串

4 个答案:

答案 0 :(得分:1)

(问题的第一部分)

您可以将第一种格式与此正则表达式匹配,后者使用{n}指定仅匹配第一次出现

  $pattern = "(^.*?\{format[a-z0-9=\s]*\}.){1}"

从第一个字符开始,在第一个格式之前进行非贪婪匹配,然后恰好{1}出现。

运行此操作以进行初始替换,然后在其他格式上执行正常的str_replace。

答案 1 :(得分:1)

以下是您的解决方案:

$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);

答案 2 :(得分:0)

对于您的第一个问题,您可以使用某种str_replace_once()

PHP manual comments中的示例:

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

要删除所有其他比赛,请参阅Sergej的回答:)

关于你的第二个问题:

$string = '{format mat=34/}';
preg_match("|\s(mat=[0-9]+)/\}$|", $string, $matches);
print_r($matches); // $matches[1] contains 'mat=34'

答案 3 :(得分:0)

  1. 不是str_replace,但是preg_replace,preg_replace的$ limit参数限制了替换次数 - 只需将其设置为1.
  2. 使用\ b - 单词边界。

    $ pattern ='/ \ bmat = [0-9] * /';