当字符串的一般格式未知时,如何从字符串中提取 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,它会找到它们,你可以提取它们。
您可以使用 strpos
和 substr
轻松做到这一点。 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);
这处理了前一种情况所指出的两种情况
我正在编写一个 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,它会找到它们,你可以提取它们。
您可以使用 strpos
和 substr
轻松做到这一点。 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);
这处理了前一种情况所指出的两种情况