php preg regex - группа пробелов без перевода строки в многострочном режиме - PullRequest
0 голосов
/ 20 марта 2011

Здравствуйте. Я пытаюсь разделить некоторые входные данные по строке и использовать trim () в каждой строке.Но я хотел бы сделать это без использования отделки, просто с помощью регулярных выражений.

Проблема, с которой я сталкиваюсь, заключается в том, что пробелы в конце строки не удаляются.Я думаю, моя группа [^ $ \ s] пропусков, но без перевода строки не работает.

Итак, вопрос в том, как решить мою проблему и как определить группу в preg regex, в которой явно сказано игнорировать разрывы строк?На данный момент я думаю, что мой подход все еще неверен.Проблема в том, что если я напишу \ s * вместо этой странной группы.. + кушает все.Если я напишу. +?Я не получаю строки, которые содержат пробелы обратно.

preg_match_all("/^\s*+(.+)[^$\s]*+$/m", $_POST['input'], $matches, PREG_SET_ORDER );

Ответы [ 2 ]

0 голосов
/ 20 марта 2011
preg_match_all("/\s*(.*\S)/", $_POST['input'], $matches, PREG_SET_ORDER );

Вам нужно что-то съесть перед пробелом, включая целые строки.\s* делает это.Вам не нужно заставлять его запускаться в начале строки, вы все равно его не сохраняете - его единственная цель - сопоставить его с точностью до непробельного символа.

Так что теперьВы знаете, что смотрите на непробельные символы, и вам нужно захватить до последнего непробельного символа в той же строке.Поскольку . не будет соответствовать символу новой строки, .*\S делает именно это.

Одно из отличий от вашей версии состоит в том, что начальный \s* следующего совпадения может использовать конечный пробел в строке, которую вы только чтосоответствует.Поскольку мы больше не заботимся об окончаниях строк, модификатор /m больше не нужен.

Вы можете сделать первую звезду притяжательной (\s*+);это не изменит того, что ему соответствует, но это приведет к тому, что в конце файла произойдет сбой незначительно быстрее, если будет длинный пустой хвост.

0 голосов
/ 20 марта 2011

Хорошо, я обычно использую регулярные выражения. Но подход trim здесь будет проще. И я предполагаю, что вы избежали этого, потому что это обычно требует дополнительного цикла. Но в этом случае вы можете сжать его до:

 $lines = array_map("trim", explode("\n", $_POST["input"]));
 // quite a handy utility function, so just wanted to note that here

Но в качестве альтернативы найденному решению вы могли бы использовать альтернативно:

preg_split('/((?!\n)\p{Z})*\n((?!\n)\p{Z})*/u', "...\n...");

Немного хакерский. Поменял ^$ только на \n и использовал утверждения для исключения новых строк в других местах. Но \p{Z} - хорошая альтернатива, чтобы поймать все вариации символов Unicode, включая NBSP и другие заполнители ниндзя.

...