Я хочу сопоставить 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]);
Он все еще не работает должным образом.
следующие могут быть входными данными, шаблоном для сопоставления = и желаемыми выходными данными:
PS: Строки также будут содержать эмодзи и ?,'.
на самом деле я пытаюсь сопоставить входную строку с предопределенным строковым шаблоном. входная строка будет содержать текстовые смайлики и другие специальные символы, например, (я студент) или (я студент). этот вход должен быть сопоставлен с несколькими предопределенными шаблонами, разделенными |, например, (я {профессия} | я {профессия}). в этом случае preg_match должен вернуть true, и в результате я хочу получить слово ученик.
было бы проще, если бы мы выполнили preg_replace строку шаблона, окруженную {}, и проигнорировали ее в preg_match, и если остальная часть входной строки совпадает со строкой шаблона, мы получим логический результат true с игнорированной строкой ввода. например, студент слова






Я просто предполагаю, что у вас есть несколько предложений с различными компонентами, и вы хотите извлечь или заменить какую-то часть из них.
Вероятно, вы захотите сначала классифицировать свои входные данные, а затем передать их через некоторые функции для сопоставления или замены. Это общее выражение может быть в порядке, чтобы просто взглянуть и посмотреть, как вы хотели бы разработать и написать некоторые выражения для ваших входных данных:
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 визуализирует регулярные выражения:
Я пришел к решению это, так как ваш ответ дал мне небольшое представление. Это правильное решение. работает нормально для меня или может быть более оптимизированным?
Пока это решение, которое соответствует моему требованию. Спасибо за помощь @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);
@ Эмма, я упомянул результаты, не могли бы вы проверить