2013-02-15 60 views
2

我和我的用户通过短信互动,如果他们给我发短信这种模式,我需要执行一个动作:正则表达式检测的文本模式

模式:

*TEXT*TEXT*TEXT# 

TEXT所有字符都是允许的,所以我做了这个表达式:

if (preg_match('/^\*([^*]*)\*([^*]*)\*([^#]*)\#$/', $text)){ 
    // perform the action... 
} 

上述正则表达式的工作原理实际上是好,但它不是让未来lines after,例如:

'*hello there*how you doing!?* and blah#'通过正则表达式,但:

'*hello there*how you doing!?* and blah# 

' 

不受上述正则表达式(注意下一行后

我就这样度过决定:

$text = str_replace("\n\r", '', $text); 

但是上面的例子仍然没有通过:-(

我应该如何在正则表达式中允许下一行?或摆脱他们?

感谢您的帮助

+1

既然你存储与正则表达式匹配的信息,从模式中删除'$'。 – hjpotter92 2013-02-15 09:58:29

+0

@BackinaFlash但是,如果他们在最新的'#'后面输入*#test#*,这仍然会传递正则表达式,所以它会毁掉整个事物... – behz4d 2013-02-15 10:01:21

回答

2

要允许可选的空间和/或换行符哈希后:

if (preg_match('/^\*([^*]*)\*([^*]*)\*([^#]*)\#\s*$/', $text)){ 

我刚刚结束主题前加上\s*的表达。

您还可以使用修剪事先:

if (preg_match('/^\*([^*]*)\*([^*]*)\*([^#]*)\#$/', trim($test))){ 

更新

作为一个额外的要求,即恒星之间的文本不能为空:

if (preg_match('/^\*([^*]+)\*([^*]+)\*([^#]+)\#$/', trim($test))){ 
+0

@hamza建议或者不应该在正则表达式中也应该是'm'?谢谢 – behz4d 2013-02-15 10:17:47

+0

也应该加'+'来禁止**(当它是空的时候)?请你编辑答案,我并不擅长正则表达式......谢谢 – behz4d 2013-02-15 10:19:58

+1

@ behz4d是的,添加'+'而不是'*'有助于防止恒星之间出现空串。 – 2013-02-15 10:20:58

1

糟糕错误,如@杰克说我们必须添加\ s *并忘记“m”。

我改变*+,使返回false时,有**之间没有任何东西:

$text = "*fddsfdsf*dfdfd*5f8ssfdssf8# 

"; 
if (preg_match('/^\*([^*]+)\*([^*]+)\*([^#]+)\#\s*$/', $text)){ 
    echo "yes"; 
}else{ 
    echo "no"; 
} 
+1

这也匹配'“* fddsfdsf * dfdfd * 5f8ssfdssf8#\ nsomething else”' – 2013-02-15 10:14:31

+0

@Jack感谢您的评论:) – HamZa 2013-02-15 10:18:21