#php
#php
Вопрос:
У меня есть эта строка
Как вы можете видеть, он явно содержит новую строку. Я хочу разделить это сообщение на массив из 2 сообщений, и я решил, что буду использовать explode()
в сочетании с PHP_EOL
, для функциональности с несколькими ОС, но я был удивлен, так как это не сработало.
explode(PHP_EOL, $str); // Array( [0] => "Divakat has attacked Gergana, dealing 591 physical damage. ( 2 absorbed )
// Gergana has died." )
explode("n", $str); // Array( [0] => ""Divakat has attacked Gergana, dealing 591 physical damage. ( 2 absorbed )", [1] => "Gergana has died." )
Я хотел бы спросить, почему первый пример работает не так, как я ожидаю, и есть ли какой-нибудь способ заставить его работать, потому что мне бы очень не хотелось жестко кодировать там символ новой строки. Спасибо.
Редактировать:
Я забыл упомянуть, что сообщение было создано на том же компьютере, на котором в данный момент тестируется этот код. Изменений в операционной системе нет.
Комментарии:
1. потому что PHP_EOL, вероятно, r n
2. Возможно, вы захотите посмотреть на preg_split с чем-то вроде
preg_split('/[rn] /', $str)
, чтобы охватить кроссплатформенный сценарий.
Ответ №1:
PHP_EOL
представляет последовательность конца строки для платформы, на которой вы находитесь в данный момент. Это волшебным образом не делает последовательность конца строки, используемую внутри строки, такой же, как у платформы.
Например, это строка с n
(жестко заданным EOL Unix):
$str = "HellonWorld";
Если вы запустите это в системе Unix, оно выведет 2:
echo count(explode(PHP_EOL, $str));
Но на другой платформе он будет печатать 1, потому $str
что не содержит ни последовательности Windows, ни Mac EOL.
Обновление: не имеет никакого значения, где был создан ввод; только то, как он был создан. Вы можете легко создать строку с Unix EOL в системе Windows, просто включив n
в нее жестко закодированные s.
Комментарии:
1. Но я не понимаю, как это может быть, если все это время я работал под Windows?
2. О боже, теперь я понимаю. Я просто взглянул на фрагмент кода, который был использован для генерации этого сообщения, и оказалось, что я
n
там жестко запрограммирован, ЛОЛ. Глупая ошибка. Спасибо, сэр!3. @php_nub_qq: Кроме того, имейте в виду, что
PHP_EOL
это практически бесполезно на практике. Если вы одновременно создаете и используете строку, это бесполезно, потому что у вас есть полная свобода в выборе последовательности EOL; это имеет значение, только если вы создаете, а кто-то другой использует или наоборот, и то только в том случае, если другая сторона ожидает использования только собственной последовательности. Допустимым примером может быть, когда вы пишете текстовый файл, который должен быть доступен для редактирования даже самым простым текстовым редактором на вашей платформе (Блокнот, я смотрю на тебя).4. Ну, я использую его в основном потому, что я разрабатываю под Windows, но когда придет время загрузить мое произведение искусства на всеобщее обозрение, то есть поместить его на мой хост, он будет работать на linux. Поэтому я использую
PHP_EOL
, чтобы избежать любых возможных потенциальных проблем, которые у меня могут возникнуть, если таковые имеются. Просто чтобы быть уверенным, я думаю: D5. @php_nub_qq: В таком случае это просто менее удобно 🙂