2014-07-12 19 views
1

我正在處理動態用戶輸入,它可以包含多個空格。我實際上想要處理的是用戶的名字。例如:JohnJohn Doe,John Doe Michael,John Doe Michael Moore在第二個空格之後獲取字符串(如果有的話),然後將它們放入變量中

我有2個變量。第一個變量是名字,所以我只是將其命名爲$fname,第二個變量是姓氏,我們將其命名爲$lname

我希望把任何字符串沒有空間或第一空間爲第一名稱或$fname和第一空間的姓氏變量或$lname後的任何部分變量,字符串的任何部分,他們之間沒有消除的空間。

所以,如果用戶給的名字,像John Doe Michael Moore,然後我想把John到變量$fnameDoe Michael Moore到變量$lname

這是我目前的做法:

$name = ($_POST['name']); 

if(strpos($name, " ")) { 
$name = explode(' ', $name); 
$count = count($name); 

    $fname = ''; 
    $lname = ''; 

    for($i = 0; $i < $count; $i++) { 
     if($i == 0) { 
      $fname .= $name[$i]; 
     } elseif($i == 1) { 
      $lname .= $name[$i]; 
     } else { 
      $lname .= ' ' . $name[$i]; 
     } 
    } 
} 

但我不喜歡在這種情況下使用循環。有沒有像使用正則表達式或其他東西的解決方案?

+0

當然,''/ ^(\ w +)\ s *(。*)/''應該這樣做。 –

回答

1

沒有必要對正則表達式;如果你很確定你會收到至少兩個人的名字,你可以保持explode(),你就會明白:

list($fname, $lname) = explode(' ', $name, 2); 

的第三個參數explode()將結果限制爲最多兩個元素。 list()執行您的兩個變量的分配。

1

從2個匹配的羣組中獲取。

^(\w+)\s+(.*)$ 

Online demo

示例代碼:

$re = "/^(\\w+)\\s+(.*)$/"; 
$str = "John Doe Michael Moore"; 

preg_match_all($re, $str, $matches); 

輸出:

1. [0-4] `John` 
2. [5-22] `Doe Michael Moore` 
1

然後,只需使用explode但陣列限制爲兩個項目是這樣的:

// Set test data array. 
$test_name_array = array('John', 'John Doe', 'John Doe Michael', 'John Doe Michael Moore');  

// Roll through the test data array. 
foreach ($test_name_array as $name) { 

    // Break the array into two parts. 
    $name = explode(' ', $name, 2); 
    $fname = isset($name[0]) && !empty($name[0]) ? $name[0] : ''; 
    $lname = isset($name[1]) && !empty($name[1]) ? $name[1] : ''; 

    // Check the output of `$name` for debugging. 
    echo '<pre>'; 
    print_r($name); 
    echo '</pre>'; 

    // Echo the first name. 
    echo 'First Name: ' . $fname; 
    echo '<br />'; 

    // Echo the last name. 
    echo 'Last Name: ' . $lname; 
    echo '<br />'; 

} 

的,這個輸出將是:

Array 
(
    [0] => John 
) 

First Name: John 
Last Name: 

Array 
(
    [0] => 
    [1] => John Doe 
) 

First Name: 
Last Name: John Doe 

Array 
(
    [0] => John 
    [1] => Doe Michael 
) 

First Name: John 
Last Name: Doe Michael 

Array 
(
    [0] => John 
    [1] => Doe Michael Moore 
) 

First Name: John 
Last Name: Doe Michael Moore 
0

正則表達式的第一個名字:

^.*(?=[^ ]*)$ 

RegEx姓氏:

[^ ]*$ 

如果您確定此世界中沒有姓可能包含空白字符,則不能使用此字符。什麼阻止你讓用戶有機會告訴你他們的真實姓名和姓氏是什麼?我認爲這裏缺乏UI/API功能是實際的問題。

相關問題