PHP Regex для проверки пробела или определенных символов после строки

#php #regex #string

#php #регулярное выражение #строка

Вопрос:

Мне нужно регулярное выражение, которое может в основном проверять наличие пробела, разрыва строки и т. Д. После строки.

Итак, условия,

  1. Разрешить специальные символы . , _ , - , внутри строки, то @hello.world есть, @hello_world , @helloworld , и т.д.
  2. Отбросьте все, включая специальные символы, где после них нет буквенно-цифровой строки, т. Е. @helloworld.<space> , @helloworld-<space> @helloworld.? , и т. Д. Должны быть проанализированы как @helloworld

Мое существующее регулярное /@([A-Za-z0-9 _.-] )/ выражение — это то, которое отлично работает с условием № 1, но, похоже, все еще существует проблемное условие № 2

Я использую приведенное выше регулярное выражение в preg_replace()

Решение:

 $str = preg_replace('#@[w .-] b#', '[[$0]]', $str);
  

Это работает отлично.

Проверено с

http://gskinner.com/RegExr/

Ответ №1:

Вы можете использовать границы слов, чтобы легко найти позицию между буквенно-цифровой буквой и не буквенно-цифровой буквой:

 $str = preg_replace('#@[w .-] b#', '[[$0]]', $str);
  

Рабочий пример: http://ideone.com/0ShCm

Ответ №2:

Вот идея:

  1. Используется strrev для изменения строки
  2. Используется strcspn для поиска самого длинного префикса перевернутой строки, которая не содержит буквенно-цифровых символов
  3. Отрежьте префикс с помощью substr
  4. Переверните строку еще раз; это ваш конечный результат

Посмотрите на это в действии.

Я не принимаю во внимание какие-либо требования, которые ограничивают допустимые символы в строке некоторым подмножеством, но вы можете использовать для этого свое регулярное выражение (или даже strspn , что может быть быстрее).

Комментарии:

1. Ваш код отлично работает для меня, но мне нужно было точное решение, которое предоставил @kobi.

2. @whoru: Этот код не будет работать так, как вы описываете, если я правильно получу описание. Попробуйте сделать это с помощью ввода @helloworld_ . Небольшой совет: не используйте решение, которое вы не до конца понимаете.

3. Мне нужно @helloworld_ было, чтобы меня приняли, потому @helloworld_ что я перешел от чего-то вроде helloworld_@gmail.com

Ответ №3:

Причина в том, что он считывает строку целиком. Если вы хотите, чтобы он анализировал все после буквенно-цифрового раздела, вам, возможно, придется выполнить like и end(explode()); и запустите это, чтобы убедиться, что оно недействительно, и если оно недействительно, удалите его из уравнения, но тогда вам придется проверить конецдля каждой возможной точки разнесения, т.Е. .,-,~ и т. Д.

Опять же, еще одна ловушка, с которой вы можете столкнуться, заключается в том, что в случае элемента или чего-либо с буквенно-цифровым значением он может просто проанализировать все, начиная с последнего буквенно-цифрового символа.

Извините, что это не очень помогает, но я подумал, что размышления вслух помогают.