我想将第一字符串与第二字符串匹配。第二个字符串将在 {} 中包含动态内容。它也用 | 分隔,因为我需要将第一个字符串与第二个字符串的多个值进行匹配,并返回布尔值。另外,如果第一字符串值与第二字符串的部分值匹配,则需要第一字符串的动态变量。我已经尝试和搜索了很多,然后想到了
$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:字符串还将包含表情符号和?'。
答案 0 :(得分:1)
到目前为止,这是可以满足我要求的解决方案。谢谢您对@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);
答案 1 :(得分:0)
我只是猜测您有包含不同组成部分的几个句子,并且您希望提取或替换其中的某些所需部分。
您可能希望先对输入进行分类,然后再通过一些函数传递它们以进行匹配或替换。只需看一看,看看您想如何设计和编写一些用于输入的表达式,就可以使用该一般表达式:
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的右上角进行了解释,如果您想探索/简化/修改它,在this link中,您可以观察到它如何与某些示例输入匹配,如果你喜欢。
$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可视化正则表达式: