#php #newline #expression
#php #новая строка #выражение
Вопрос:
Я довольно новичок в регулярных выражениях. Я собираю блок текста из элемента textarea и хочу проверить, использовал ли человек, который его заполнил, какие-либо абзацы, среди прочего.
Я использую следующее, и я знаю, что это неправильно.
preg_match('/rn|n|r/', $_GET['text']);
Ответ №1:
Ваше регулярное выражение не является неправильным. Но для обнаружения абзацев вам потребуется искать две последовательные новые строки:
preg_match('/(r?n){2}/'
Возврат каретки r
необязателен, и я бы просто проверил n
перевод строки, поскольку большинство платформ рассматривают это как разрыв строки. Очевидно, что эта проверка завершится неудачей, если отправленный текст представляет собой всего лишь одну строку без абзацев или новых строк.
В качестве альтернативы вы также можете проверить наличие двух новых строк с любым видом пробелов между ними:
preg_match('/(s*n){2}/'
Комментарии:
1. Спасибо за эти предложения, к сожалению, ни одно из них не сработало для меня. Итак, немного подробнее: я написал скрипт, который считывает блок текста и анализирует его на предмет основных особенностей написания. Файл csv определяет ряд правил, с каждым из которых связано регулярное выражение. Вот CSV-запись с одним из предложенных вами выражений. Абзац (ы), W, 3,a,p,»/(s*n){2}/», Начинайте новый абзац с каждым новым фокусом., Он загружается fgetcsv, а затем тестируется с помощью preg_match. Может ли этот процесс повлиять на это? Большое спасибо за ваше время, любая дальнейшая помощь действительно ценится.
2. Хотя в CSV это escape-последовательность, ее
fgetcsv
следует оставитьn
в покое. Но вам лучше распечатать регулярное выражение для целей отладки. (Регулярное выражение хорошо работает в моих тестах.)3. Оно выводится как /(s * n){2}/ , точно так же, как и в csv. Я немного озадачен.
4. Распечатайте
$_GET["text"]
и сравните через view source, действительно ли оно содержит новые строки.5. Ах-ха! Интересно. В нем нет новых строк. Даже если это происходит в текстовой области. Удаляет ли метод GET этот материал?
Ответ №2:
Предполагая:
Это абзац. Это абзац. Это абзац. Это абзац. Это абзац. Это абзац. Это абзац. Это абзац. Это абзац.
И это еще одно. И это еще одно. И это еще одно. И это еще одно. И это еще одно. И это еще одно. И это еще одно. И это еще одно. И это еще одно. И это еще одно.
Вы могли бы просто сделать:
if (str_replace("rnrn", '', $str) != $str)
// the input contains at least two paragraphs
Комментарии:
1. Спасибо за это. Я пытаюсь сохранить его с помощью preg_match, поскольку он обрабатывает серию правил из csv-файла в цикле, но я буду помнить о вашем решении и попробую его.
2. Я попробовал, но оно всегда возвращает положительный результат, даже если в текстовом поле нет абзацев: if (str_replace(» r n r n», «, $text) == $ text) echo ‘Обнаружены абзацы.’; Спасибо за вашу помощь, есть еще идеи?
3. @Ed Fearon Действительно. Я изменил условие.