php preg_split w / regex - PullRequest
       9

php preg_split w / regex

1 голос
/ 14 июня 2010
<?php
$str = '17:30 Football 18:30 Meal 20:00 Quiet';
$chars = preg_split('/^([0-1][0-9]|[2][0-3]):([0-5][0-9])$/', $str, -1, PREG_SPLIT_OFFSET_CAPTURE);
print_r ($chars);
?> 

вернул:

Array ( 
  [0] => Array ( 
    [0] => 17:30 Football 18:30 Meal 20:00 Quiet 
    [1] => 0 
  ) 
) 

пока я надеялся на:

Array ( 
  [0] => Array ( 
    [0] => Football
    [1] => 7 
  ) 
  [1] => Array ( 
    [0] => Meal 
    [1] => 22 
  ) 

  etc.

Что я могу сделать?

Ответы [ 3 ]

1 голос
/ 14 июня 2010

Вам нужно бросить якоря ^ и $ вокруг вашего регулярного выражения - с ними на месте регулярное выражение никогда не сможет совпадать, поскольку они требуют, чтобы разделительная строка начиналась в начале строки и заканчивалась в конце строка - это никогда не может быть правдой, если только вы не введете 17:30.

Возможно, вы захотите включить в свое регулярное выражение пробел, например

$chars = preg_split('/\s*([0-1][0-9]|2[0-3]):([0-5][0-9])\s*/', $str, -1, PREG_SPLIT_OFFSET_CAPTURE);
0 голосов
/ 14 июня 2010

Или:

$chars = preg_split('/\b[0-9:\s]{6,7}\b/', $str,-1,PREG_SPLIT_OFFSET_CAPTURE);

Это удаляет начальный пробел.

0 голосов
/ 14 июня 2010

В регулярных выражениях символы ^ и $ являются привязками к началу и концу соответственно сканируемой строки текста.Попробуйте удалить их из вашего шаблона.Возможно, попробуйте что-то вроде:

<?php
$str = '17:30 Football 18:30 Meal 20:00 Quiet';
$chars = preg_split('/(?:[01]\d|2[0-3]):(?:[0-5]\d)/', $str, -1, PREG_SPLIT_OFFSET_CAPTURE);
print_r ($chars);
?>

Не забывайте, что : - это специальный символ в регулярных выражениях, поэтому его необходимо экранировать.

По умолчанию all групп в скобках запоминаются, но вы можете остановить это с помощью синтаксиса ?:.Я не совсем уверен, вызовет ли это проблему в PHP, потому что я протестировал выражение с Python, но это должно предотвратить возвращение совпадений в массив.

Вы также можете немного расширить выражениечтобы автоматически убрать пробелы вокруг ваших слов:

$chars = preg_split('/\s*(?:[01]\d|2[0-3]):(?:[0-5]\d)\s*/', $str, -1, PREG_SPLIT_OFFSET_CAPTURE);

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...