2010-08-22 80 views
2

我有這樣分割和呼應成一個列表

Hattie:07903 000066::Dad:07854 000095::Tom:07903 000044::Allistair:07765 000005::Home:0115 974 0000:: 

SQL表詳細地址的我想分裂每個人,使每個聯繫人的姓名和電話號碼是呼應成seprate如下面的列表框中的面板

<ol> 
<li>Hattie:07903 000066</li> 
<li>Dad:07854 000095</li> 
</ol> 

任何幫助將是輝煌的。

感謝

SEO Leicester

回答

2

重構數據庫以避免地址存儲爲分隔字符串,但將每個地址作爲地址表中的一行存儲,最好將名稱和地址作爲單獨的列,這樣會更好。爲使搜索更加努力了很多,並且對數據的操作(添加新的地址等)

$addresses = explode('::',$addressField); 
echo '<ol>'; 
foreach($addresses as $address) { 
    echo '<li>',$address,'</li>'; 
} 
echo '</ol>'; 

編輯

(無恥地竊取大獎賽的答案格式)

$addresses = explode('::',$addressField); 
echo '<ol>'; 
foreach($addresses as $address) { 
    list($name,$phone) = explode(':',$address); 
    echo '<li>Name: ',$name,' Telephone: ',$phone,'</li>'; 
} 
echo '</ol>'; 
+0

如果您從其他響應中提取代碼,您至少可以給它一個信用 - +1。 – Dummy00001 2010-08-22 12:05:55

+0

@ Dummy00001 - 提升輸出的格式而不是提升代碼......並且SO抱怨說我已經提高了它的效率,所以我不能再這樣做 – 2010-08-22 12:20:50

+0

由於代碼的複雜性,很難從真實代碼中分辨格式;) – Dummy00001 2010-08-22 12:41:33

3

您可以分割你的字符串是這樣的:

$adresses = explode("::", $yourString) 

然後,你想一個簡單的foreach將打印內容。

+1

啊我覺得像這樣的小白XD抱歉,這是一個redicoulous的問題 – user393273 2010-08-22 11:02:11

+1

您能否告訴我我將使用的foreach – user393273 2010-08-22 11:02:42

+0

您可以在@Mark Ba​​ker解決方案中看到完整的代碼。但是在複製/粘貼之前理解代碼會更好。 – 2010-08-22 11:06:44

4

無汗在Perl:

#! /usr/bin/perl 

local $_ = "Hattie:07903 000066::Dad:07854 000095::Tom:07903 000044::Allistair:07765 000005::Home:0115 974 0000::"; 

print "<ol>\n", 
     map("<li>$_</li>\n", split /::/), 
     "</ol>\n"; 

正如你的問題時,該序列::終止,而不是一個分離器,這使得split有點概念不匹配。爲了更緊密貼合的格式,使用列表上下文中的正則表達式匹配/g

/g修飾符指定全球模式匹配,也就是說,該字符串中的匹配多次越好。它的行爲方式取決於上下文。在列表上下文中,它返回正則表達式中任何捕獲括號所匹配的子字符串列表。

和非貪婪量詞

默認情況下,量化的子模式是「貪婪的」,也就是說,它會多次匹配越好(給出一個特定的起始位置),同時還允許其餘的模式匹配。如果您希望它符合可能的最小次數,請使用量詞與?。需要注意的意義,不會改變,只是「貪婪」 ...

這相當於

print "<ol>\n", 
     map("<li>$_</li>\n", /(.+?)::/g), 
     "</ol>\n"; 

無論哪種方式,輸出爲

<ol> 
<li>Hattie:07903 000066</li> 
<li>Dad:07854 000095</li> 
<li>Tom:07903 000044</li> 
<li>Allistair:07765 000005</li> 
<li>Home:0115 974 0000</li> 
</ol>