使用preg_match和regex显示html表中字符串的内容

时间:2015-12-05 16:11:33

标签: php regex preg-replace

我有一个字符串,其中包含由管道分隔的用户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表格的wepage上显示这些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>$1</td><td>$2</td><td>$3</td><td>$4</td></tr></table>',$users);

它按预期工作但是管道正在纳入产出。

您可以在https://eval.in/480802

上看到我的代码的实时演示

我的正则表达式有问题吗?

3 个答案:

答案 0 :(得分:1)

使用preg_replace时,你的正则表达式根本不会触及|字符,因此只需将其留在那里。 一个简单的解决方案是,如果它存在于当前正则表达式模式的末尾,则使用单个|字符:

/([A-Za-z]+):([0-9]+):([A-Za-z]):([^\|]+)\|?/(最后添加了\|?

请记住,|字符也应该被转义(\|)。

答案 1 :(得分:1)

如果我是你,我只需用</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>';

(注意:我不认为你想为每条记录设置一个不同的表,所以我把所有记录放在同一个表中,每条记录都有一行。)

答案 2 :(得分:1)

如果您的数据仅包含|作为用户分隔符,:作为用户详细信息分隔符,则可以使用2 explode这样:

$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;
}

请参阅IDEONE demo

输出:

<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>