#php #regex #string
#php #регулярное выражение #строка
Вопрос:
Мне нужно регулярное выражение, которое может в основном проверять наличие пробела, разрыва строки и т. Д. После строки.
Итак, условия,
- Разрешить специальные символы
.
,_
,-
,@hello.world
есть,@hello_world
,@helloworld
, и т.д. - Отбросьте все, включая специальные символы, где после них нет буквенно-цифровой строки, т. Е.
@helloworld.<space>
,@helloworld-<space>
@helloworld.?
, и т. Д. Должны быть проанализированы как@helloworld
Мое существующее регулярное /@([A-Za-z0-9 _.-] )/
выражение — это то, которое отлично работает с условием № 1, но, похоже, все еще существует проблемное условие № 2
Я использую приведенное выше регулярное выражение в preg_replace()
Решение:
$str = preg_replace('#@[w .-] b#', '[[$0]]', $str);
Это работает отлично.
Проверено с
Ответ №1:
Вы можете использовать границы слов, чтобы легко найти позицию между буквенно-цифровой буквой и не буквенно-цифровой буквой:
$str = preg_replace('#@[w .-] b#', '[[$0]]', $str);
Рабочий пример: http://ideone.com/0ShCm
Ответ №2:
Вот идея:
- Используется
strrev
для изменения строки - Используется
strcspn
для поиска самого длинного префикса перевернутой строки, которая не содержит буквенно-цифровых символов - Отрежьте префикс с помощью
substr
- Переверните строку еще раз; это ваш конечный результат
Я не принимаю во внимание какие-либо требования, которые ограничивают допустимые символы в строке некоторым подмножеством, но вы можете использовать для этого свое регулярное выражение (или даже strspn
, что может быть быстрее).
Комментарии:
1. Ваш код отлично работает для меня, но мне нужно было точное решение, которое предоставил @kobi.
2. @whoru: Этот код не будет работать так, как вы описываете, если я правильно получу описание. Попробуйте сделать это с помощью ввода
@helloworld_
. Небольшой совет: не используйте решение, которое вы не до конца понимаете.3. Мне нужно
@helloworld_
было, чтобы меня приняли, потому@helloworld_
что я перешел от чего-то вродеhelloworld_@gmail.com
Ответ №3:
Причина в том, что он считывает строку целиком. Если вы хотите, чтобы он анализировал все после буквенно-цифрового раздела, вам, возможно, придется выполнить like и end(explode()); и запустите это, чтобы убедиться, что оно недействительно, и если оно недействительно, удалите его из уравнения, но тогда вам придется проверить конецдля каждой возможной точки разнесения, т.Е. .,-,~ и т. Д.
Опять же, еще одна ловушка, с которой вы можете столкнуться, заключается в том, что в случае элемента или чего-либо с буквенно-цифровым значением он может просто проанализировать все, начиная с последнего буквенно-цифрового символа.
Извините, что это не очень помогает, но я подумал, что размышления вслух помогают.