当字符串的一般格式未知时,如何从字符串中提取 UUID?

How do I extract a UUID from a string when the general format of the string is unknown?

我正在编写一个 PHP 脚本,其中我作为输入获取的字符串之一的格式未知。例如,我可能会得到输入:

user Name <7a240011-1b54-4a91-be27-a5cf8f474a39

或者我可以获得输入:

7a240011-1b54-4a91-be27-a5cf8f474a39

我的问题是字符串是这样的:

user Name <7a240011-1b54-4a91-be27-a5cf8f474a39

如何删除 user Name < 让我只剩下 UUID?

现在,更难的是 UUID 永远不一样,而且 user Name < 将始终使用不同的名称。

这似乎是正则表达式的少数合法用途之一。写了一个匹配UUID的正则表达式后(比如this one), you can throw your string into preg_match,如果里面有UUID,它会找到它们,你可以提取它们。

您可以使用 strpossubstr 轻松做到这一点。 strpos returns 字符的索引或 false 如果未找到。这样,如果字符串不包含 <,您可以保持不变。

请注意,在检查 false 时需要使用严格的比较运算符(===!==),因为字符串可能在 [=] 位置包含 < 21=].=,当使用普通比较运算符 (==!=) 进行比较时,它的计算结果也会为假(反之亦然)。

<?php
$x = 'user Name <7a240011-1b54-4a91-be27-a5cf8f474a39';

// Find the position of the `<`.
$p = strpos($x, '<');

// If that character exists, copy only the part after it.   
if ($p !== false) {
  $x = substr($x, $p+1);
}

echo $x;

您可以轻松地从中创建一个函数,以便您可以从任何地方调用它。正如您所看到的,它处理不同用户名的情况,或者只是一个根本没有用户名的代码:

<?php
function getUserId($input) {
  $p = strpos($input, '<');

  if ($p !== false) {
    $input = substr($input, $p+1);
  }
  return $input;
}

echo getUserId('user Name <7a240011-1b54-4a91-be27-a5cf8f474a39') . '<br>';
echo getUserId('user Longer Name <7a240011-1b54-4a91-be27-a5cf8f474a39') . '<br>';
echo getUserId('7a240011-1b54-4a91-be27-a5cf8f474a39') . '<br>'a;

最简单的解决方案是您可以在第一次出现“<”之前去掉所有内容。我在这里用两个不同的示例名称替换了 'name' 来说明:

<?php

$name1 = "user Michael <7a240011-1b54-4a91-be27-a5cf8f474a39";
$name2 = "user Jasvinder <7a240011-1b54-4a91-be27-a5cf8f474a39";

print substr($name1, strpos($name1, "<")+1);
print substr($name2, strpos($name2, "<")+1);

但是请注意,如果 "Name" 字段包含“<”,就会有困难。

编辑 既然你已经接受了这个作为解决方案,我想改变它一些更好的东西:

<?php

$name1 = "user Michael <7a240011-1b54-4a91-be27-a5cf8f474a39";
$name2 = "user Jasvinder <7a240011-1b54-4a91-be27-a5cf8f474a39";
$name3 = "7a240011-1b54-4a91-be27-a5cf8f474a39";

print preg_replace("/^.*\</","",$name1);
print preg_replace("/^.*\</","",$name2);
print preg_replace("/^.*\</","",$name3);

这处理了前一种情况所指出的两种情况