Сопоставить строку с другой строкой, имеющей динамическое строковое содержимое

Я хочу сопоставить 1-ю строку со 2-й строкой. Вторая строка будет иметь динамическое содержимое внутри {}. Он также разделен |, так как мне нужно сопоставить 1-ю строку с несколькими значениями 2-й строки и вернуть логическое значение. Кроме того, мне нужны динамические переменные из 1-й строки, если значение 1-й строки совпадает с частичным значением 2-й строки. Я много пробовал и искал, и пришел к этому

$message = "wala hi";
$pattern = "Mujhey|mujhe|mujh'y|mjy?|mujy|wala {dynamicontent}";
$pattern = str_replace('/', '/', $pattern);
$text = '/^'.preg_replace('/\{((?:(?!\d+,?\d+?)\w)+?)\}/', '(?<$1>.*)', $pattern).' ?$/miu';
$regexMatched = (bool) preg_match($text, $message, $matches) || (bool) preg_match($text, '', $matches);
var_dump([$regexMatched, $matches]);

Он все еще не работает должным образом.

следующие могут быть входными данными, шаблоном для сопоставления = и желаемыми выходными данными:

  1. ввод: воспроизвести демо-песню, шаблон: воспроизвести {песню}, вывод: возвращает true и демо-песню
  2. ввод: play demo-song, шаблон: play {song}, вывод: возвращает false и null
  3. ввод: показать профиль hoizer, шаблон: показать профиль {исполнитель}, вывод: возвращает true и hoizer
  4. ввод: показать сезон GOT 2019, шаблон: показать сезон {год} {серии}, вывод: возвращает true и [0=>2019, 1=>GOT]

PS: Строки также будут содержать эмодзи и ?,'.

@ Эмма, я упомянул результаты, не могли бы вы проверить

Abbie 21.07.2019 19:02

на самом деле я пытаюсь сопоставить входную строку с предопределенным строковым шаблоном. входная строка будет содержать текстовые смайлики и другие специальные символы, например, (я студент) или (я студент). этот вход должен быть сопоставлен с несколькими предопределенными шаблонами, разделенными |, например, (я {профессия} | я {профессия}). в этом случае preg_match должен вернуть true, и в результате я хочу получить слово ученик.

Abbie 21.07.2019 21:47

было бы проще, если бы мы выполнили preg_replace строку шаблона, окруженную {}, и проигнорировали ее в preg_match, и если остальная часть входной строки совпадает со строкой шаблона, мы получим логический результат true с игнорированной строкой ввода. например, студент слова

Abbie 21.07.2019 22:11
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
3
511
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я просто предполагаю, что у вас есть несколько предложений с различными компонентами, и вы хотите извлечь или заменить какую-то часть из них.


Вероятно, вы захотите сначала классифицировать свои входные данные, а затем передать их через некоторые функции для сопоставления или замены. Это общее выражение может быть в порядке, чтобы просто взглянуть и посмотреть, как вы хотели бы разработать и написать некоторые выражения для ваших входных данных:

play\s+([^,]+?)\s*,|show\s+(.*?)\s+profile|show\s+(\d{4})\s+season\s+of\s+([^,]+?)\s*,|i(?:'m)?\s+.*?(?:\ba\b|\ban\b)\s+(\S+)

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


Выражение объясняется на верхней правой панели regex101.com, если вы хотите изучить/упростить/изменить его, а в эта ссылка вы можете посмотреть, как оно будет соответствовать некоторым примерам входных данных, если хотите.

Тестовое задание

$re = '/play\s+([^,]+?)\s*,|show\s+(.*?)\s+profile|show\s+(\d{4})\s+season\s+of\s+([^,]+?)\s*,|i(?:\'m)?\s+.*?(?:\ba\b|\ban\b)\s+(\S+)/mi';
$str = 'play demo-song, pattern: play {song},
show hoizer profile, pattern: show {artist} profile
show 2019 season of GOT, pattern: show {year} season of {series},

PLAY demo-song, pattern: PLay {song},
SHOW hoizer some other artists profile, pattern: show {artist} profile
show   2019 SEASON   OF  GOT  , pattern: show {year} season of {series},

i am a student I AM  A programmer i\'m a suergeon pattern: I\'m a {profession}, ';

preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);

var_dump($matches);

Цепь регулярных выражений

jex.im визуализирует регулярные выражения:

Я пришел к решению это, так как ваш ответ дал мне небольшое представление. Это правильное решение. работает нормально для меня или может быть более оптимизированным?

Abbie 24.07.2019 12:52
Ответ принят как подходящий

Пока это решение, которое соответствует моему требованию. Спасибо за помощь @Emma.

function checkPattern($stringToTest, $pattern) {
    str_replace("\|", "|", preg_quote($pattern));
    $pattern = str_replace("|", "$|^", preg_replace('/' . preg_quote('{') . '.*?' .preg_quote('}') . '/', '(.*)', $pattern));
    $regexMatched = (bool) preg_match("/^".$pattern."$/mi", $stringToTest, $matches);
    var_dump([$regexMatched, end($matches)]);
}

//test 1 returns [true, hozier]
$stringToTest = "play songs by hozier";
$pattern = "play songs by {artist}|play {artist} songs|{artist} songs"; 
checkPattern($stringToTest, $pattern);

//test 2 returns [false, false]
$stringToTest = "show hozier";
$pattern = "show {artist} profile|view {artist} profile"; 
checkPattern($stringToTest, $pattern);

Другие вопросы по теме