子串正好在另一个子串之后

时间:2015-03-28 20:36:26

标签: php string function

所以我有这个大字符串,其中包含以下内容:

"(...) Status: Ativo
Identificador: F36CE5
Meio de Pagamento: Cartão de crédito
Data de contratação: 25/03/2015
Data de expiração: 25/03/2017 (...)"

* the "(...)" is just to identify that there are more content before and after this part

我的目标是在"Identificador:"之后立即仅隔离部分,即,我需要获取值"F36CE5"(当然每次都不同)并将其设置为变量。

我尝试了以下代码:

$initialString = "Status: Ativo
Identificador: F37CE5
Meio de Pagamento: Cartão de crédito
Data de contratação: 25/03/2015
Data de expiração: 25/03/2017";


$arr = explode(":", $initialString);
$important = $arr[2];
echo $important;

但是我得到了

F37CE5
Meio de Pagamento

我应该怎么做才能获得F37CE5

有没有办法告诉PHP:“在'Identificador:'之后给出正确的字符串,仅此而已”?

6 个答案:

答案 0 :(得分:1)

首先拆分线,然后搜索带有“Identificator”的线:

$initialString = "Status: Ativo
Identificador: F37CE5
Meio de Pagamento: Cartão de crédito
Data de contratação: 25/03/2015
Data de expiração: 25/03/2017";

$lines = explode("\n", $initialString);
foreach($lines as $line) {
  list($first, $second) = explode(":", $line);
  if (trim($first) == 'Identificator') {
    $important = $second;
    break;
  }
}
echo $important;

答案 1 :(得分:1)

使用正则表达式。 类似的东西:

<?php
$pattern = '/Identificador: (\w+)/';
preg_match($pattern, $initialString, $matches);
print_r($matches[1]);
?>

$ matches [1]将包含您要查找的字符串。

答案 2 :(得分:1)

一个简单的方法是使子串具有正确的开始,然后获得所需的部分:

$initialString = "Status: Ativo
Identificador: F37CE5
Meio de Pagamento: Cartão de crédito
Data de contratação: 25/03/2015
Data de expiração: 25/03/2017";

$substring = substr($initialString, strpos($initialString, "Identificador:") + 14);
$substring = substr($substring, 0, strpos($substring, "\n"));

答案 3 :(得分:0)

如果字符串的长度始终相同,则可以执行此操作

echo substr($important, 0, 6);

答案 4 :(得分:0)

所有其他答案都建议爆炸和分裂线,这通常很慢。您应该使用strpos并循环显示结果。

在我的测试中(循环10,000次),我的代码在非常大的测试字符串上只花了0.249秒。在相同条件下,此页面上发布的其他代码花费0.811秒执行相同的任务。

<?php
   $pos = 0;
   while(($pos = strpos($input,"Identificador:",$pos)) !== false) {
      $end = strpos($input,"\n",$pos);
      if($end) {
         $line = substr($input,$pos,$end-$pos);
         $parts = explode(':',$line);
         echo $parts[1]."\n";
         $pos = $end;
      }else{
         $pos++;
      }
   }
?>

答案 5 :(得分:0)

您可以使用正则表达式捕获组:

preg_match("/Identificador\s*:\s*(\w+)/",$initialString,$matches);

然后将结果存储在$matches[1]中,如果找不到匹配项,则数组为空。