0

我想解析一个文本文件,并使时间戳(如果存在)彩色和粗体。基本上,文本可能如下所示:

15:40 - User1: hey
15:41 - User2: i was about to hit the road, but have at it
15:42 - User1: i was just wondering

现在,我在 \r\n 上爆炸(这已经很愚蠢了,因为行本身可能包含一个中断,但现在将其放在一边),所以我用一个 foreach 循环来完成它。

$string = explode("\r\n", $file);
foreach($string as $ex) {
    echo "<p>".$ex."</p>\r\n";
}

假设我想加粗整个时间戳,包括用户名。str_replace 不起作用,因为 : 也在时间戳中。我的问题是,我如何将整个部分加粗?检查“ - ”的 strpos 给我留下了偏移量 5,但是如何将整个部分加粗,直到下一个冒号出现?(同样,撇开人们的用户名可能有一个冒号)

见鬼,如果我自己能搞定,是否有可能将其更改为 $timestamp、$seperator、$user 和 $message?

亲切的问候,

卫斯理

4

2 回答 2

1

你最好在这里使用正则表达式:

$bolded = preg_replace('/^\d+:\d+\s*-\s*[^:]+/', '<b>$1</b>', $ex);

这匹配模式^\d+:\d+\s*-\s*[^:]+并将其替换为<b>$1</b>,这实际上意味着匹配放置在粗体标记内(<strong>用于更多语义,这只是一个示例)。

^\d+:\d+\s*-\s*[^:]+匹配什么?

^      at the start of the string...
\d+    one or more digits             -+
:      a double colon                  +---> the time
\d+    one or more digits             -+
\s*    zero or more whitespace
-      a dash
\s*    zero or more whitespace
[^:]+  one or more of "not :"         -----> the username
于 2013-10-14T14:46:20.893 回答
1

您可以strpos()使用offset

foreach($array as $value) {
    $needle = ':';
    $pos1 = strpos($value, $needle);
    $pos2 = strpos($value, $needle, $pos1 + strlen($needle));
    $bold = substr($value, 0, $pos2);
    $notBold = substr($value, $pos2);
    echo "<p><strong>$bold</strong>$notBold</p>";
}

演示!

于 2013-10-14T14:46:29.427 回答