2010-04-16 3 views
0

У меня есть строка данных, как показано ниже, и я изо всех сил пытался выяснить, как разбить ее, чтобы я мог эффективно использовать ее.PHP найти первое вхождение строки

"United States FirstName: Mike LastName: Doe City: Chicago" 

Мне нужно разделить строку на подстроки, и список может не всегда находиться в одном порядке.

Например, это может меняться, как показано ниже:

"United States City: Chicago FirstName: Mike LastName: Doe" 
"CanadaFirstName: Mike City: Chicago LastName: Doe" 

Мне нужно найти какой параметр приходит первый после «Соединенных Штатов». Это могут быть «Город:», «FirstName:» или «LastName:». И мне также нужно знать начальную позицию первого параметра.

Заранее благодарен!

ответ

0

Во-первых, сдирать "Соединенные Штаты": $str2 = substr($string, 0, strlen("United States "))

Затем найти поле: preg_match('/^([^:]+): /', $str2)

Положение первого параметра должно быть постоянным: strlen("United States ")

+0

Должен сказать, что это не всегда начинается с «Соединенных Штатов», это может быть что-то другое. – mike

+0

@mike Это должно помочь: 'preg_match ('/^([^ \:] +) \ s + (\ w +) \: /', $ string)' Первый задний ребро - это «Соединенные Штаты», а второй backref является первым полем. –

0
$string = "United States FirstName: Mike LastName: Doe City: Chicago"; 
$i = strpos($string, ":");   // Find the first colon 
while ($string[$i] != " ") { $i--; } // work backwards until we hit a space 
// First parameter's name now starts at $i + 1 
+0

Это пространство не всегда может быть там :( – mike

+0

Хорошо, если нет четко определенной структуры, мы не можем ожидать его разбора. –

+0

FirstName: City: LastName: всегда будет там. Я просто не знаю, вокруг них будет пространство. – mike

1

Пока FirstName:, LastName: и City: всегда будут там, вы должны иметь возможность просто получить позиции всех трех и посмотреть, min().

$string = "United States City: Chicago FirstName: Mike LastName: Doe"; 
$firstname = strpos($string, 'FirstName:'); 
$lastname = strpos($string, 'LastName:'); 
$city = strpos($string, 'City:'); 

$position = min($firstname, $lastname, $city); 
switch($position){ 
    case $firstname: 
     $first_parameter = 'FirstName:'; 
     break; 
    case $lastname: 
     $first_parameter = 'LastName:'; 
     break; 
    case $city: 
     $first_parameter = 'City:'; 
     break; 
} 

У вас будет свой первый параметр и позиция.

1

Я думаю, что самый чистый и простой способ сделать это (хотя сексуальное регулярное выражение является соблазнительным) заключается в том, чтобы поместить ваши параметры в массив и пропустить через него.

$params = array(
    'FirstName:', 
    'LastName:', 
    'City:', 
); 

$first = null; # First parameter 
$first_pos = null; # First parameter position 

foreach($params as $var) 
{ 
    $pos = strpos($string, $var); 
    if($pos < $first_pos || null === $first_pos) 
    { 
     $first = $var; 
     $first_pos = $pos; 
    } 
} 

Если вы изменили свои параметры, просто измените массив.

Смежные вопросы