2012-02-15 72 views
3

我有一個字符串分裂的姓名和編號

「JonSmith02-11-1955」

我用 preg_split獲得JonSmith(REG = '[0-9-]'),那麼再次做('[a-zA-Z] \')以獲得他的出生日期。 有沒有更好的方法讓他們在一個分裂?

回答

4
/(?<=[a-z])(?=\d)/i 

在這種情況下工作。它匹配一個字母后面跟一個數字的位置。閱讀關於lookbehinds and -aheads的更多信息。

如果名稱可以包含數字,這將不起作用。

DEMO

1
^([a-zA-z]*)([0-9]*)\-(.+)*$ 

對於此示例:

JonSmith02-11-1955 

得到:

JonSmith 
02 
11-1955 

enter image description here

0
preg_match('/([a-z]+)([0-9-]+)/i', 'JonSmith02-11-1955', $matches); 
echo "Name is $matches[1]<br>\n"; 
echo "Birth date is $matches[2]<br>\n"; 

See it working

2

^(.*)(\d{2})\-(\d{2})\-(\d{4})$怎麼樣? 它會將您的字符串解析爲四部分:JonSmith,02111955

+0

這可能是魯棒性方面的最佳解決方案。你應該提到它應該和'preg_match'一起使用。而不是爲每個數字創建一個捕獲組,您可能需要對整個日期進行分組。 – 2012-02-15 14:43:12

+0

看起來你正處於貪婪的危險之中...... – DaveRandom 2012-02-15 14:46:04

1

嘗試/(\w*)(\d{2}-\d{2}-\d{4})/作爲您的正則表達式 - 別人可以更有效地做到這一點。這會給你兩個捕獲組,所以

$array = preg_match_all('/(\w*)(\d{2}-\d{2}-\d{4})/', "JonSmith02-11-1955"); 
print_r($array); 
/* 
Array 
(
    [0] => Array 
     (
      [0] => JonSmith02-11-1955 
     ) 

    [1] => Array 
     (
      [0] => JonSmith 
     ) 

    [2] => Array 
     (
      [0] => 02-11-1955 
     ) 

) 

*/