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

#php #regex

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

Вопрос:

Я хочу извлечь слова, которые содержат как алфавитные, так и числовые символы / например, функция возвращает ac64fc в тексте ниже: foo ac64fc bar 4544

  preg_match('/^[0-9A-Z]*([0-9][A-Z]|[A-Z][0-9])[0-9A-Z]*$/', $subject);
  

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

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

1. Итак, для пояснения, вы хотите сопоставить полные слова , которые содержат как буквенный, так и числовой символ? Например. совпадение ac64fc , но не foo или 4544 ?

Ответ №1:

Вы заставляете входную строку быть только в заданном формате с помощью ^ и $ привязок. Замените их на b (маркер границы слова), и все готово (также не забудьте включить i флаг, который делает его нечувствительным к регистру).

Также для упрощения вы можете использовать следующую версию, которая, очевидно, не вызывает поисковые запросы:

 b(?:[a-z] d|d [a-z])[a-zd]*b
  

Смотрите живую демонстрацию здесь

PHP-код:

 preg_match('/b(?:[a-z] d|d [a-z])[a-zd]*b/i', $subject);
  

Ответ №2:

Попробуйте регулярное выражение: (?=w*d)(?=w*[a-zA-Z])[A-Za-zd]

ДЕМОНСТРАЦИЯ

Ответ №3:

В вашей строке нет символов верхнего регистра, но вы можете использовать границу слова b и позитивный прогноз (?= , чтобы указать цифру, и при сопоставлении убедитесь, что соответствует хотя бы один символ a-zA-Z.

(Или наоборот, ищите символ от а до Я и сопоставляйте как минимум 1 цифру)

 b(?=[A-Za-z0-9]*[0-9])[A-Za-z0-9]*[A-Za-z][A-Za-z0-9]*b
  

демонстрация регулярных выражений

Используя флаг без учета регистра, ваш код может выглядеть так:

 $subject = "foo ac64fc bar 4544";
preg_match('/b(?=[A-Za-z0-9]*[0-9])[A-Za-z0-9]*[A-Za-z][A-Za-z0-9]*b/i', $subject, $matches);
print_r($matches[0]); // ac64fc
  

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

1. @ZaGol Ты пробовал это так? 3v4l.org/968VD Какие данные вы использовали?

2. : Как я могу преобразовать $matches[0] из массива в текст? я должен передать его методу, который получает текстовую переменную, когда я отправляю $matches[0], он ничего не показывает, а когда я отправляю $matches, он показывает Array

3. @ZaGol Можете ли вы поделиться кодом или отправить ссылку, которая показывает код и данные, которые вы использовали?

4. preg_match('/b(?=[A-Za-z0-9]*[0-9])[A-Za-z0-9]*[A-Za-z][A-Za-z0-9]*b/i', $subject, $matches); message($chat_id,$matches,$message_id); -> показывает массив message($chat_id,$matches[0],$message_id); -> ничего не показывает

5. @ZaGol Вы уверены, что у вас есть правильные данные? 3v4l.org/YckNJ Что var_dump($subject): это вам дает?