使用 preg_match 和正则表达式显示 html table 中的字符串内容
Display contents of a string in html table using preg_match and regex
我有一个字符串,其中包含用竖线分隔的用户的 ASL
我的字符串:
Jack:22:m:london,uk|john:20:m:otava, canada|ketty:26:f:san fransisco|patricia:19:f:guatemala city
我的正则表达式:
/([A-Za-z]+):([0-9]+):([A-Za-z]):([^|]+/
我想在 html table 的网页上显示这些 asls。
jack 22 m london,uk
john 20 m otava canada
我的代码:
$users="Jack:22:m:london,uk|john:20:m:otava, canada|ketty:26:f:san fransisco|patricia:19:f:guatemala city";
echo preg_replace('/([A-Za-z]+):([0-9]+):([A-Za-z]):([^|]+)/','<table border="1"><tr><td></td><td></td><td></td><td></td></tr></table>',$users);
它按预期工作,但管道 |正在包含在输出中。
上看到我的代码的现场演示
我的正则表达式有问题吗?
当使用 preg_replace 时,您的正则表达式根本不会触及 |
字符,因此只需将其保留在那里。
一个简单的解决方案是使用单个 |
字符,如果它存在于当前正则表达式模式的末尾:
/([A-Za-z]+):([0-9]+):([A-Za-z]):([^\|]+)\|?/
(最后添加了\|?
)
记住 |
字符也应该被转义 (\|
)。
如果我是你,我会简单地将竖线替换为 </td></tr><tr><td>
,将分号替换为 </td><td>
:
$users="Jack:22:m:london,uk|john:20:m:otava, canada|ketty:26:f:san fransisco|patricia:19:f:guatemala city";
echo '<table border="1"><tr><td>'
. strtr($users, ['|'=>'</td></tr><tr><td>', ':'=>'</td><td>'])
. '</td></tr></table>';
(注意:我认为您不希望每条记录都有不同的 table,所以我将所有记录都放在同一个 table 中,每条记录各占一行)。
如果您的数据仅包含 |
作为用户分隔符,以及 :
作为用户详细信息分隔符,您可以像这样使用 2 explode
s:
$users="Jack:22:m:london,uk|john:20:m:otava, canada|ketty:26:f:san fransisco|patricia:19:f:guatemala city";
$usr_arr = explode('|', $users);
foreach ($usr_arr as $usr)
{
$parts = explode(':', $usr);
echo '<table border="1"><tr><td>'.$parts[0].'</td><td>'.$parts[1].'</td><td>'.$parts[2].'</td><td>'.$parts[3].'</td></tr></table>'.PHP_EOL;
}
输出:
<table border="1"><tr><td>Jack</td><td>22</td><td>m</td><td>london,uk</td></tr></table>
<table border="1"><tr><td>john</td><td>20</td><td>m</td><td>otava, canada</td></tr></table>
<table border="1"><tr><td>ketty</td><td>26</td><td>f</td><td>san fransisco</td></tr></table>
<table border="1"><tr><td>patricia</td><td>19</td><td>f</td><td>guatemala city</td></tr></table>
我有一个字符串,其中包含用竖线分隔的用户的 ASL
我的字符串:
Jack:22:m:london,uk|john:20:m:otava, canada|ketty:26:f:san fransisco|patricia:19:f:guatemala city
我的正则表达式:
/([A-Za-z]+):([0-9]+):([A-Za-z]):([^|]+/
我想在 html table 的网页上显示这些 asls。
jack 22 m london,uk
john 20 m otava canada
我的代码:
$users="Jack:22:m:london,uk|john:20:m:otava, canada|ketty:26:f:san fransisco|patricia:19:f:guatemala city";
echo preg_replace('/([A-Za-z]+):([0-9]+):([A-Za-z]):([^|]+)/','<table border="1"><tr><td></td><td></td><td></td><td></td></tr></table>',$users);
它按预期工作,但管道 |正在包含在输出中。
上看到我的代码的现场演示我的正则表达式有问题吗?
当使用 preg_replace 时,您的正则表达式根本不会触及 |
字符,因此只需将其保留在那里。
一个简单的解决方案是使用单个 |
字符,如果它存在于当前正则表达式模式的末尾:
/([A-Za-z]+):([0-9]+):([A-Za-z]):([^\|]+)\|?/
(最后添加了\|?
)
记住 |
字符也应该被转义 (\|
)。
如果我是你,我会简单地将竖线替换为 </td></tr><tr><td>
,将分号替换为 </td><td>
:
$users="Jack:22:m:london,uk|john:20:m:otava, canada|ketty:26:f:san fransisco|patricia:19:f:guatemala city";
echo '<table border="1"><tr><td>'
. strtr($users, ['|'=>'</td></tr><tr><td>', ':'=>'</td><td>'])
. '</td></tr></table>';
(注意:我认为您不希望每条记录都有不同的 table,所以我将所有记录都放在同一个 table 中,每条记录各占一行)。
如果您的数据仅包含 |
作为用户分隔符,以及 :
作为用户详细信息分隔符,您可以像这样使用 2 explode
s:
$users="Jack:22:m:london,uk|john:20:m:otava, canada|ketty:26:f:san fransisco|patricia:19:f:guatemala city";
$usr_arr = explode('|', $users);
foreach ($usr_arr as $usr)
{
$parts = explode(':', $usr);
echo '<table border="1"><tr><td>'.$parts[0].'</td><td>'.$parts[1].'</td><td>'.$parts[2].'</td><td>'.$parts[3].'</td></tr></table>'.PHP_EOL;
}
输出:
<table border="1"><tr><td>Jack</td><td>22</td><td>m</td><td>london,uk</td></tr></table>
<table border="1"><tr><td>john</td><td>20</td><td>m</td><td>otava, canada</td></tr></table>
<table border="1"><tr><td>ketty</td><td>26</td><td>f</td><td>san fransisco</td></tr></table>
<table border="1"><tr><td>patricia</td><td>19</td><td>f</td><td>guatemala city</td></tr></table>