我有一个充满地址的sql表'喜欢这个
Hattie:07903 000066::Dad:07854 000095::Tom:07903 000044::Allistair:07765 000005::Home:0115 974 0000::
我想分开每一个,以便每个联系人的姓名和号码回显到列表框中的单独面板,如下所示
<ol>
<li>Hattie:07903 000066</li>
<li>Dad:07854 000095</li>
</ol>
任何帮助都会很棒。
由于
答案 0 :(得分: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>
答案 1 :(得分:3)
您可以像这样分割字符串:
$adresses = explode("::", $yourString)
然后一个简单的foreach将按照您的意愿打印内容。
答案 2 :(得分:2)
最好重构数据库,以便地址不会存储为分隔字符串,但每个地址都作为地址表中的一行...最好将名称和地址作为单独的列... make搜索和操作数据(添加新地址等)要困难得多
$addresses = explode('::',$addressField);
echo '<ol>';
foreach($addresses as $address) {
echo '<li>',$address,'</li>';
}
echo '</ol>';
修改强>
(无耻地从Prix的答案中窃取格式)
$addresses = explode('::',$addressField);
echo '<ol>';
foreach($addresses as $address) {
list($name,$phone) = explode(':',$address);
echo '<li>Name: ',$name,' Telephone: ',$phone,'</li>';
}
echo '</ol>';