使用preg_match在一些字符之后拆分字符串

时间:2010-02-24 13:59:19

标签: php preg-replace

我发现这个代码最多匹配300个字符,然后在下一个最接近的字断点处中断:

 $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

$ matches [0]最终没有给我点,但$ var确实如此。任何人都可以告诉我如何获得完整的字符串(带点)?

4 个答案:

答案 0 :(得分:2)

我可以通过以下方式获得预期的结果:

  • 删除\b
  • \b
  • 替换$

修改

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

有关正则表达式中字边界如何工作的详细信息,请参阅this

答案 1 :(得分:2)

使用preg_match打破300个字符似乎是一个坏主意。你为什么不用它:

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

这将为您提供在下一个空格中打破的前300个字符,而不使用正则表达式。

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

在你的

  

(?:。*?)

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

老实说,我只会使用模式

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