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
Л. Укестад
Код, содержащийся в вопросе:
$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)',
)
Попробуйте это лучше с помощью регулярного выражения: preg_split("/\\sand\\s/i",$str);
он взрывается в случае (AND & и) как..
" and "
, см. 3v4l.org/dgbDH$output=explode(" and ",$str);
должно сработать. какая проблема у вас с этим?