Как удалить слова в PHP, которые содержат символы не алфавита из строки?

Как бы я удалить целые слова из строки, содержащей символы, которые не из алфавита?

редактировать Тем не мение, ' а также - должны быть единственными символами, которые разрешены рядом с алфавитом.

Например: This is a? #test e3ample

становится: This is

Решения, которые я нашел, направлены на удаление определенных символов из строки, а не всего слова.

Я пытался создать массив с запрещенными символами, но это плохая практика. Как бы я сделал это с Regex? Или что-то подобное.

-3

Решение

Мы можем попробовать заменить регулярное выражение следующим шаблоном:

(?=[^ ]*[^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+|$)
1

Другие решения

Просто напишите совпадение для последовательных символов, которые бы не соответствует определению «слово», например:

  • любые не просторные символы \S*
  • отрицательный список разрешенных символов [^-a-z\s] плюс пространство
  • не просторные персонажи \S*

Хитрость заключается в том, что любая непробельная строка будет сопоставляться, если она содержит один символ, которого нет в допустимом наборе.

0

По моим тестам этот шаблон является наименьшим, потому что он избегает обходов и групп захвата. Если это не работает для всех случаев, пожалуйста, прокомментируйте мне строку, которая нарушает его.

Демо-версия: https://regex101.com/r/h9w3xn/5

Шаблон:

/\S*[^a-z '-]\S* | \S*[^a-z '-]\S*/i

(Без замены строки)

Это будет соответствовать недопустимым подстрокам и либо начальному, либо конечному пробелу (но не обоим одновременно), чтобы сгенерировать чистую строку вывода.

Можно было бы прокомментировать, что это не очень СУХОЙ шаблон, потому что он повторяется, но его преимущества: эффективность и, я думаю, удобочитаемость.

Отвечая с моего телефона; поправь меня если я не прав.

0
По вопросам рекламы [email protected]