2010-02-24 57 views
3

后,我发现这个代码将匹配最多300个字符,然后在下一个最近的字中断:分割字符串一些字符用的preg_match

$var = 'This is a test text 1234567890 test check12.' # 44 chars 
preg_match('/^.{0,300}(?:.*?)\b/iu', $var, $matches); 
echo $matches[0]; 

44比300更低,所以我希望输出与$ var一样。

但输出是:

This is a test text 1234567890 test check12 # 43 chars 

$比赛[0]不给我末点,但是是$ var一样。任何人都可以告诉我如何获得完整的字符串(带点)?

回答

2

我能得到由预期的结果:

  • 卸下\b
  • $
更换 \b

编辑:

在您的模式中,字符串末尾的点作为字边界,因此您可以匹配点之前的所有内容。如果你在\b之后加上.*,你会发现它会匹配点。

请参阅this了解正则表达式中单词边界如何工作的更多信息。

0

在你

(?:*?)

你应该摆脱的*我想。这意味着它必须至少匹配一次,但最多无限次。所以你会发现你的时期在第二场比赛。

说实话,我只想用图案

preg_match('/^(.){0,300}\b/iu', $var, $matches); 
+0

'*'表示0或更多。 '+'表示1个或更多。 – thetaiko 2010-02-24 14:10:23

1
'/^.{300}(?:.*?)\b|^.*{0,300}/u' 

我不知道为什么你想要这个。 Here是我对类似问题的回答,但在前一个最近的空间切割。

2

使用preg_match在300个字符处中断似乎是一个坏主意。你为什么不只是使用:

substr($var, 0, strpos($var, ' ', 300)); 

这会给你的第一个字符300在下一空白破不使用正则表达式。