Функция разнесения игнорирует символ пробела

0

PHP:

$str="M. M. Grice and B. H. Alexander and L. Ukestad ";
// I need to explode the string by delimiter "and"
$output=explode("and",$str);

Вывод:
MM Grice
BH Alex
эр
Л. Укестад

В названии "Александр" есть "и", так что тоже было разделено. Итак, я изменил его на $output=explode(" and ",$str)//as delimiter "and" has space. Но это работает.

где я ошибаюсь? Я пробовал $output=explode("\ and\ ",$str). Но никто из них не работал

Ожидаемый результат:
MM Grice
BH Alexander
Л. Укестад

  • 1
    Работает нормально, взорвавшись с " and " , см. 3v4l.org/dgbDH
  • 0
    $output=explode(" and ",$str); должно сработать. какая проблема у вас с этим?
Показать ещё 2 комментария
Теги:
explode

2 ответа

0
Лучший ответ

Код, содержащийся в вопросе:

$output=explode(" and ", $str);

это правильный способ получить желаемый результат.

Это не работает, когда символы вокруг строки and в строке ввода $str не являются регулярными пробелами (" " == chr(32)), но вкладки ("\t" == chr(9)), новые строки ("\n" == chr(10)) или другие символы пробела.

Строку можно разделить с помощью preg_split():

$output = preg_split('/\sand\s/', $str);

будет использоваться and окружен любым символом пробела в качестве разделителя.

Другое regex которое можно использовать:

$output = preg_split('/\band\b/', $str);

это разделит $str используя слово and как разделитель, независимо от того, какие символы (не буквенные, нецифровые, не-подчеркивающие) окружают его. Он будет распознавать and как разделитель в строке, "MM Grice and BH Alexander (and L. Ukestad)" в вопросе, но также в "MM Grice and BH Alexander (and L. Ukestad)".

Нежелательным побочным эффектом является то, что пространства вокруг and не являются частью разделителя, и они останутся в разделенных фрагментах. Их можно легко удалить, обрезая части, возвращаемые preg_split():

$str = "M. M. Grice and B. H. Alexander (and L. Ukestad)";
$output = array_map('trim', preg_split('/\band\b/', $str));
var_export($output);

отобразит:

array (
  0 => 'M. M. Grice',
  1 => 'B. H. Alexander (',
  2 => 'L. Ukestad)',
)
0

Попробуйте это лучше с помощью регулярного выражения: preg_split("/\\sand\\s/i",$str); он взрывается в случае (AND & и) как..

Ещё вопросы

Сообщество Overcoder
Наверх
Меню