Как бы я удалить целые слова из строки, содержащей символы, которые не из алфавита?
редактировать Тем не мение, '
а также -
должны быть единственными символами, которые разрешены рядом с алфавитом.
Например: This is a? #test e3ample
становится: This is
Решения, которые я нашел, направлены на удаление определенных символов из строки, а не всего слова.
Я пытался создать массив с запрещенными символами, но это плохая практика. Как бы я сделал это с Regex? Или что-то подобное.
Мы можем попробовать заменить регулярное выражение следующим шаблоном:
(?=[^ ]*[^A-Za-z \'-])([^ ]*)(?:\\s+|$)
При этом используется предпросмотр, чтобы проверить, содержит ли каждое слово не буквенный символ. Если так, то это удалит все это слово. Черточки и одинарные кавычки также допускаются.
$input = "H3llo This is a? #test e3ample of a sentence-word bl&h.";
echo preg_replace('/(?=[^ ]*[^A-Za-z \'-])([^ ]*)(?:\\s+|$)/', '', $input);
This is of a sentence-word
Редактировать:
Если в будущем вам понадобится добавить разрешенные символы в список (кроме тире и одиночного апострофа), просто добавьте их в класс символов. Например. чтобы также разрешить точку и запятую, используйте этот шаблон:
(?=[^ ]*[^A-Za-z \'.,-])([^ ]*)(?:\\s+|$)
Просто напишите совпадение для последовательных символов, которые бы не соответствует определению «слово», например:
\S*
[^-a-z\s]
плюс пространство\S*
Хитрость заключается в том, что любая непробельная строка будет сопоставляться, если она содержит один символ, которого нет в допустимом наборе.
По моим тестам этот шаблон является наименьшим, потому что он избегает обходов и групп захвата. Если это не работает для всех случаев, пожалуйста, прокомментируйте мне строку, которая нарушает его.
Демо-версия: https://regex101.com/r/h9w3xn/5
Шаблон:
/\S*[^a-z '-]\S* | \S*[^a-z '-]\S*/i
(Без замены строки)
Это будет соответствовать недопустимым подстрокам и либо начальному, либо конечному пробелу (но не обоим одновременно), чтобы сгенерировать чистую строку вывода.
Можно было бы прокомментировать, что это не очень СУХОЙ шаблон, потому что он повторяется, но его преимущества: эффективность и, я думаю, удобочитаемость.
Отвечая с моего телефона; поправь меня если я не прав.