我想解析一个文本文件,并使时间戳(如果存在)变为彩色和粗体。基本上,文本可能如下所示:
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?
亲切的问候,
韦斯利
答案 0 :(得分: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
答案 1 :(得分: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>";
}