2010-08-22 47 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>