2010-02-24 6 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] не дает мне точку в конце, однако $ вар делает. Кто-нибудь может сказать мне, как получить полную строку (с точкой)?

ответ

2

я мог бы получить ожидаемый результат по:

  • Удаление \b
  • Замена \b с $

EDIT:

В вашем шаблоне точка в конце строки действует как граница слова, поэтому вы можете сопоставить все перед точкой. Если вы положите .* после \b, вы увидите, что он будет соответствовать точке.

См. this для получения дополнительной информации о том, как границы слова в регулярном выражении работают.

0

В вашей

(?.? *)

Вы должны избавиться от * я думаю. Это означает, что он должен совпадать хотя бы один раз, но до бесконечности. Таким образом, вы обнаружите, что ваш период во втором матче.

быть честным, я бы просто использовать шаблон

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

'*' означает 0 или больше. «+» означает 1 или более. – thetaiko

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

Я не уверен, почему вы этого хотите. Here - это мой ответ на аналогичный вопрос, но вырезание в предыдущем ближайшем пространстве.

2

Использование preg_match для разбивки на 300 символов кажется плохой идеей. Почему бы вам не просто использовать:

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

Это даст вам первые 300 символов разбиты на следующем пробельных без использования регулярных выражений.

Смежные вопросы