#php #regex
#php #регулярное выражение
Вопрос:
Я пытаюсь преобразовать строку в массив слов, условие состоит в том, что слово считается таковым только в том случае, если оно содержит две или более букв, у меня есть следующее, но слова с одной буквой по-прежнему считаются совпадающими:
$input_string = "I have a cake inside my fridge";
$string_array = preg_split("/[^w{2,}]*([s] ([^w{2,}])*|$)/", $input_string, -1, PREG_SPLIT_NO_EMPTY);
Но я все еще получаю слова «I» и «a», почему это не работает?
Комментарии:
1. Alt без регулярных выражений .. т.е. Менее запутанный, взорванный с помощью array_filter: 3v4l.org/kdPgh
2. @LawrenceCherone Да, спасибо, но это должно быть сделано с помощью шаблона регулярных выражений :/
3. Какой точный результат вы ожидаете здесь?
Ответ №1:
Причина, по которой это не работает, заключается в том, что шаблон [^w{2,}]*([s] ([^w{2,}])*|$)
соответствует только пробелам, а затем вы разбиваете эти пробелы, в результате чего получается массив со всеми словами. Это связано с s
тем, что соответствует символу пробела, и с использованием класса отрицаемых символов [^w{2,}]
, который также соответствует символам пробела.
Если вы хотите использовать разделение, вам также необходимо сопоставить символы одного слова, чтобы они не были частью результата.
Если вы должны использовать разделение, вы можете сопоставить либо символ одного слова, окруженный необязательными горизонтальными пробелами, чтобы также удалить их, либо сопоставить 1 горизонтальные пробелы.
h*bwbh*|h
Демонстрация регулярных выражений
Например
$input_string = "I have a cake inside my fridge";
$string_array = preg_split("/h*bwbh*|h /", $input_string, -1, PREG_SPLIT_NO_EMPTY);
print_r($string_array);
Вывод
Array
(
[0] => have
[1] => cake
[2] => inside
[3] => my
[4] => fridge
)
Если вы хотите сопоставить все строки, состоящие как минимум из 2 символов, вы также можете использовать S{2,}
с preg_match_all .
Ответ №2:
Если вы просто хотите записать все «слова», содержащие 2 или более букв, тогда просто используйте preg_match_all
here:
$input_string = "I have a cake inside my fridge";
preg_match_all("/bw{2,}b/", $input_string, $matches);
print_r($matches[0]);
Это выводит:
Array
(
[0] => have
[1] => cake
[2] => inside
[3] => my
[4] => fridge
)