仅在第一次替换部分字符串,WITH offset

时间:2013-10-14 14:40:19

标签: php str-replace explode strpos

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

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?

亲切的问候,

韦斯利

2 个答案:

答案 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>";
}

Demo!