正则表达式忽略某些事件

时间:2014-11-01 03:12:48

标签: php regex preg-split

我有一个相当棘手的小正则表达式问题,我可以使用一些帮助。

我有一个看起来像这样的源字符串;

%t:H\:i\:s

我正在努力想弄清楚正确的正则表达式语句是什么,我可以在PHP preg_split函数中使用它将上面的示例字符串拆分为独立的冒号':',但保留':'字符串文字指定的序列在分割之外。

因此,成功完成后,最终结果将是;

array
(
  [0] => %t
  [1] => H\:i\:s
)

我不是正则表达的大师,并且已经尝试了许多策略,但没有运气。任何帮助都会非常感激。

提前谢谢。

4 个答案:

答案 0 :(得分:1)

您可以使用negative lookbehindpreg_split("/(?<!\\\\):/", "%t:H\:i\:s")

DEMO

答案 1 :(得分:1)

你不需要去看看。只需根据\b:\b

拆分输入字符串
$string = '%t:H\:i\:s';
$parts  = preg_split('/\b:\b/', $string);
var_dump($parts); 

输出:

array(2) {
  [0]=>
  string(2) "%t"
  [1]=>
  string(7) "H\:i\:s"
}

<强>解释

\b:\b将匹配前面和后面跟有单词字符的冒号。这将仅匹配此t:H部分中的冒号,因为t:之间存在word boundary:H

答案 2 :(得分:0)

匹配冒号并使用负面的后卫(确保冒号在其前面有反斜杠。)

$format = '%t:H\:i\:s';
$parts  = preg_split('/(?<!\\\\):/', $format);
var_dump($parts);

答案 3 :(得分:0)

你可以像这样使用爆炸移位内爆

$a = explode(':', '%t:H\:i\:s');
$r = array( array_shift( $a ) );
$r[] = implode(':', $a );