PHP正则表达式和字符串分段
所以我要做的是让这个$d数组在现实中,我将从excel单元格中提取值。但是我为这个例子创建了一个数组。数组通知中的每组字符串都有一个“;”在某个地方,有些字符串有“AKA”,有些字符串有“UNKNOWN”。这些字符串是随机的,所以我不确定哪个字符串会出现在excel单元格中。我需要的是在第一个“AKA”之前提取名字和姓氏。还试图提取第一个“;”前面的名字和姓氏。并识别“未知”字符串 我首先应用带$r的preg匹配,以通过“;”进行标识。 接下来,我确定$re22中是否存在“AKA”。 现在我陷入困境的是:我知道“AKA”确实存在于2个数组字符串中。现在,我想在我想存储它们之后,在这两个具有“AKA”的数组字符串上应用$r23?我该怎么做PHP正则表达式和字符串分段,php,arrays,regex,string,Php,Arrays,Regex,String,所以我要做的是让这个$d数组在现实中,我将从excel单元格中提取值。但是我为这个例子创建了一个数组。数组通知中的每组字符串都有一个“;”在某个地方,有些字符串有“AKA”,有些字符串有“UNKNOWN”。这些字符串是随机的,所以我不确定哪个字符串会出现在excel单元格中。我需要的是在第一个“AKA”之前提取名字和姓氏。还试图提取第一个“;”前面的名字和姓氏。并识别“未知”字符串 我首先应用带$r的preg匹配,以通过“;”进行标识。 接下来,我确定$re22中是否存在“AKA”。 现在我陷入
$r = "/(^.*?)(?=;|$)/";
$re22 = "/(AKA)/";
$re24 = "/(UNKNOWN)/";
$r23 = "/(^.*?)(?=AKA|$)/";
$d = ["AMALIAOKLP RETTOMATTIS AKA AMALIAOKLP M RETTOMATTIS; ROSCAR RETTOMATTIS AKA ROSCAR ALBERTO RETTOMATTIS AKA ROSCAR A RETTOMATTIS",
"IVESS PALM IMPROVEMENT INC; HHJP KGSEING LAANK ASSOCIATION; REWQROYAL MYLLWORK INC; REWAABCO TOOFING INC; UNITED",
"DAVID SWEREISENSON; RONA SWEREISENSON; MELLINGTON; TEEGATTA BAY; LATIONAL CITY", "JAMES DECIMA AKA JAMES P DECIMA; GLORIA `enter code here` DECIMA; REARLWOOD ASSOCIATION INC; INC; BORE NA",
"UNKNOWN PARTIES","NATIONAL ASSOCIATION; SAVALENCIA AT INC; ASSEMBLY INC"];
foreach($d as $x => $x_value) {
// echo "Key=" . $x . ", Value=" . $x_value;
echo "BREAK. <br>";
$q = preg_match($r, $x_value, $matches);
//echo "Key=" . $x . ", Value=" . $matches;
var_dump($matches[0]);
echo "BREAK2. <br>";
//does 'aka' exist in the matches? if so do next
$q22 = preg_match($re22, $matches[0], $matches22);
//echo "Key=" . $x . ", Value=" . $matches;
var_dump($matches22[0]);
echo "BREAK3.<br>";
if (in_array('AKA', $matches22, true)) {
$q25 = preg_match($re23, $matches[0], $matches25);
var_dump($matches25);
}
}
您可以使用正则表达式来实现这一点。只要你下定决心,你几乎可以用正则表达式做任何事情。“可以”,而不是“应该”。在这种情况下,为了代码的可读性,我认为您最好使用几个位置良好的调用。也许是这样的:
foreach ($d as $contacts)
{
/* Split based on semicolons. */
$contacts = explode('; ', $contacts);
$primary_contact = $contacts[0];
$contact_aliases = explode(' AKA ', $contacts[0]);
if (strpos($contact_aliases[0], 'UNKNOWN') !== FALSE)
printf("No name found.\n");
else
printf("Name: %s\n", $contact_aliases[0]);
}
我会尝试这种方法。在分号上分解,然后在零索引上使用正则表达式,因为您说过您只关心列表中的第一个组
<?php
$d = array("AMALIAOKLP RETTOMATTIS AKA AMALIAOKLP M RETTOMATTIS; ROSCAR RETTOMATTIS AKA ROSCAR ALBERTO RETTOMATTIS AKA ROSCAR A RETTOMATTIS",
"IVESS PALM IMPROVEMENT INC; HHJP KGSEING LAANK ASSOCIATION; REWQROYAL MYLLWORK INC; REWAABCO TOOFING INC; UNITED",
"DAVID SWEREISENSON; RONA SWEREISENSON; MELLINGTON; TEEGATTA BAY; LATIONAL CITY", "JAMES DECIMA AKA JAMES P DECIMA; GLORIA `enter code here` DECIMA; REARLWOOD ASSOCIATION INC; INC; BORE NA",
"UNKNOWN PARTIES","NATIONAL ASSOCIATION; SAVALENCIA AT INC; ASSEMBLY INC");
foreach($d as $x => $x_value) {
$split = explode(';', $x_value);
if(preg_match('~(.*?)\s+(?:AKA|UNKNOWN)~', $split[0], $named)) {
$store[] = trim($named[1]);
}
}
print_r($store);
。。。或者可能未知不应在同一组中?请尝试将其设置为动态数组$matches25[],而不是$matches25。另外,你的preg_匹配有一个拼写错误,应该是$r23;preg_match$re23你能不能只用两个爆炸语句,一个在同一时间爆炸;另一个在AKA,那么你的名字都要分开了阿玛利奥普·雷托马蒂斯和詹姆斯·德西玛这是你唯一希望的两个名字?是的,我在想爆炸在地面上;也会更好。我认为AKA也可能是未知的,所以可能还需要一个正则表达式。哎呀,你说得对。我本来打算实际使用split的正则表达式特性,但后来决定不使用它,并忘了在它的位置上使用explode。
Array
(
[0] => AMALIAOKLP RETTOMATTIS
[1] => JAMES DECIMA
)