我发现这个代码最多匹配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确实如此。任何人都可以告诉我如何获得完整的字符串(带点)?
答案 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);