2013-05-15 1 views
1

я очень плохо регулярное выражение, у меня есть:Простые регулярные выражения - поиск слов, включая номера, но только по поводу

/(@[A-Za-z-]+)/ 

, который находит слова после символа @ в текстовом поле, однако мне это нужно игнорировать электронную почту адреса, такие как:

[email protected] 

однако он находит @things

мне нужно включить номера, например:

@He2foo 

однако он находит только часть @He.

Помощи ценится, и если вы чувствуете, как объяснить регулярное выражение в простых терминах, что было бы здорово: D

+0

do 'you @ want', чтобы соответствовать на' @ want' здесь? или вы хотите только выбрать токены '@ separate'? –

+0

Извините, не видел этого раньше, только отдельные токены, а не [email protected] –

ответ

1
/(?:^|(?<=\s))@([A-Za-z0-9]+)(?=[.?]?\s)/ 

@This (соответствует) регулярное выражение [email protected], но матчи на @separate лексем, а также маркеры в конце предложения, как @this. или @this? (без выбирая . или ?) И да [email protected] также игнорируются.

Регулярное выражение, подбирая на @ также позволяет быстро получить доступ к что после него (как userid в @userid), подбирая регулярное выражение group(1). Проверьте документацию PHP о том, как работать с группами регулярных выражений.

+0

Привет. Кажется, что это хорошо работает, но игнорирует самый первый матч, например: http://puu.sh/2TYn0.png, первый игнорируется, потому что это начало текста. –

+0

@CoreyThompson Обновлено. –

+0

Работает отлично, потрясающе. Благодаря! –

1

Вы можете просто добавить 0-9 к вашим регулярным выражениям, например, так:

/(@[A-Za-z0-9-]+)/ 

Не думайте, что вам нужно больше объяснений, так как вы смогли зайти так далеко. 0-9 точно так же, как a-z (хотя и численный курс).

Чтобы игнорировать адрес электронной почты, вам необходимо будет предоставить более конкретные требования. Вы можете попробовать предыдущий @ с (^|), который в основном утверждает, что ваше значение ДОЛЖНО предшествовать началу строки (так что ничего действительно, хотя в начале) или пробел.

Расширяя это, вы также можете использовать ($|) на конце, чтобы потребовать, чтобы значение за ним следовало в конце строки или пробела (что означает, что не существует допустимого периода, что является требованием для действительного адреса электронной почты).

Обновление

$subject = "@a @b [email protected] [email protected] @b"; 
preg_match_all("/(^|)@[A-Za-z0-9-]+/", $subject, $matches); 
print_r($matches[0]); 
+0

Удивительный, спасибо. Точно так же: /($ | @ [A-Za-z0-9 -] +)/ –

+0

'/ (^ |) @ [A-Za-z0-9 -] + /' попробуйте это вместо этого (оберните это предотвратить любые ошибки). Кроме того, убедитесь, что этот подход по-прежнему соответствует вашим требованиям. – Aquillo

+0

Прошу прощения, нажмите Enter, прежде чем я набрал его. Я попробовал пример, который у меня есть, и он работал очень хорошо, за исключением того, что проигнорировал самый первый матч (потому что перед ним ничего не было), попытаться попробовать^| Теперь. –

 Смежные вопросы

  • Нет связанных вопросов^_^